我的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');
因此,当调用网址SERVER/My/admin
时,会调用index
类的AdminController
方法。
我的问题:如何处理查询字符串?
我想要一个带有表单的页面。提交后,表单会发送到SERVER/My/admin/check
,即发送到check.php
文件夹中的admin
页面。
我定义了这样的路线
My\system\classes\Registry::get("Router")->add('/My/admin/check','AdminController#check');
但是找不到URL,当然,因为查询字符串被附加到URL。我该如何处理这个问题?
答案 0 :(得分:1)
在检查$_SERVER['REQUEST_URI']
之前,请删除第一个?
之后的所有内容(如果有)。使用该值检查它是否与$url
匹配。像这样简单的东西可以解决问题:
$request = $_SERVER['REQUEST_URI'];
if( ($pos = strpos($request, '?')) !== false) $request = substr($request, 0, $pos);
任何需要使用查询参数的控制器都应该能够从$_GET
或最差$_SERVER['QUERY_STRING']
获取它们。