PHP路由如何处理查询参数


php routing how to handle query parameters?

我在我的php项目中有一个路由器类,它是这样工作的:

public function dispatch(){
     foreach ($this->routes as $url => $action) {
        if( $url == $_SERVER['REQUEST_URI'] ){
            if(is_callable($action)) return $action();
            $actionArr = explode('#', $action);
            $controller = 'My''system''controllers'''.$actionArr[0];
            $method = $actionArr[1];
            return (new $controller)->$method();
        }
    }
}

我这样定义路由:

My'system'classes'Registry::get("Router")->add('/My/admin/','AdminController#index');

当URL SERVER/My/admin被调用时,AdminController类的index方法被调用。

我的问题:我如何处理查询字符串?

我想要一个有表单的页面。在提交时,表单被发送到SERVER/My/admin/check,即admin文件夹中的check.php页面。

我这样定义路由

My'system'classes'Registry::get("Router")->add('/My/admin/check','AdminController#check');

,但没有找到URL,当然,因为查询字符串附加到URL。我该如何最好地处理这件事?

在检查$_SERVER['REQUEST_URI']之前,删除第一个?之后的所有内容,如果有的话。使用该值检查它是否与$url匹配。像这样简单的操作就可以达到目的:

$request = $_SERVER['REQUEST_URI'];
if( ($pos = strpos($request, '?')) !== false) $request = substr($request, 0, $pos);

任何需要使用查询参数的控制器都应该能够从$_GET或最坏的$_SERVER['QUERY_STRING']中获得它们。

这个例子来自我的项目,我如何处理这个

REQUEST_URI -访问该页面的URI;例如,'/index.html'。

$full_router = $_SERVER['REQUEST_URI'];

strtok()将字符串(string)拆分为更小的字符串(token),每个token由token中的任意字符分隔。

$router = strtok($full_router, '?'); // This is how you can handle query parameters

现在你可以用if语句匹配URL了

if($router === '/' ){
    include('/pages/home.php');
}