簡體   English   中英

用2個或更多參數重寫URL

[英]Rewrite url with 2 or more params

我之前曾問過一個這樣的問題,但是由於我仍然找不到答案,因此我將再次提出它:-s。

我正在使用這個非常基本的“模板”腳本:

require_once 'core/init.php';

if(empty($_GET['page'])){
    header('Location: home');
    die();
}

$basePath = dirname(__FILE__) . '/';
$viewPath = $basePath . 'view/';

$view = scandir($viewPath);

foreach($view as $file)     
{
    if (!is_dir($viewPath . $file))
    {
        $pages[] = substr($file, 0, strpos($file, '.'));

    }
}

if(in_array($_GET['page'], $pages)){
    include($viewPath . $_GET['page'] . '.php');
} else{
    include($basePath . '404.php');
}

並且我使用此htaccess文件將我的網址從/base/index.php?page=somepage重寫為/base/somepage (somepage是我的模板文件夾中的.php文件)

RewriteEngine On

RewriteBase /base/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^?]*) index.php?page=$1 [L,QSA]

使用1參數可以正常工作,但是我的問題是我不知道如何重寫第二個參數/base/profile?user=username (沒有htaccess文件,它看起來像是/base/index.php?page=profile?user=username ),我希望它看起來像這樣/base/profile/username

我希望這個問題是可以理解的:-s

路由是一個實際的問題,我無法一一列舉,但我會盡力而為。 請原諒我的英語水平,如果您聽不懂,請告訴我。 我還有很多東西要學習,所以我會嘗試通過我所做的事情來解釋,但這可能是完全可以改進的。

今天有關路由和解釋請求的PHP標准建議書應實現PSR7

我通過正在構建的MVC框架中的FrontController設計模式親自使用它來理解這些概念。 我的文件夾是這樣組織的:

  • 上市 :
    在啟動Web服務器的位置,您可以找到JavaScript / CSS。 有一個index.php僅包含

    require_once( '../的index.php');

  • 應用程序:哪里有路由器,幾乎所有的通用代碼

  • Src:哪里有應用程序的特定代碼。 這意味着現在是控制器和實體。

  • 供應商:Composer依賴項(例如GuzzleHTTP)在實際請求和代碼之間具有一個類。

這是我根目錄下的index.php中的代碼:

<?php
require_once 'vendor/autoload.php';

use Namespace\FrontController;
use \GuzzleHttp\Psr7\ServerRequest;
use function Http\Response\send;

$front_ctrl = new FrontController(ServerRequest::fromGlobals());
send($front_ctrl->getResponse());

重點是我在實現PSR7的類的實例中解釋請求。

在我的FrontController中,我的請求通過某些方法(例如刪除尾部斜杠)傳遞,最終最終在要處理的Router類中發送

我的Router類的目的是檢查URI是否存在於我將所有以此格式存儲在json文件中的所有路由的數組中:

{
    "/": [
      "AppController",
      "indexAction",
      ["GET", "POST"]
    ],...
}

這也是我使用正則表達式在URI(例如/ article /:id)中匹配變量的地方。
可以按“此URI是否在我的應用程序中存在嗎?”的形式恢復此類。

此時,我將所有數組作為參數實例化一個新的Route類。 從這里開始,我必須回答諸如“是否將它附加到控制器中的方法上?”,“是否處理了所要求的方法?”之類的問題。 ...

總而言之,在這一點上,我有一個代表該請求的Class實例,另一個代表所有的路線。 我面對他們以獲得一個我將通過類路線實例操作的路線。

如果它通過了所有這些測試,那么我可以實例化正確的Controller,在該控制器中將存在應用程序特定的邏輯部分,需要執行一些操作以獲取數據,然后將這些數據發送到視圖中以生成HTML輸出,然后將其發送一直返回到我的函數send,以便在您請求特定的URI時顯示輸出。

這個長答案的重點是向您展示幾乎完全獨立於服務器的內容。 如果您的應用越來越大並且必須處理更特定的路由規則,這也很有用。 它迫使您分離應用程序的所有捆綁包:控制器既不是模型也不是路由器...

嘗試找到一些很好的教程來學習PHP中的面向對象編程,這可以避免簡單的安全問題,並在開發應用程序時給您更多的舒適感:)

希望它是可以理解和有用的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM