我在我的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');
}