【发布时间】:2011-03-15 23:32:32
【问题描述】:
请考虑以下非常基本的“控制器”(为简单起见,本例中的函数):
function Index() {
var_dump(__FUNCTION__); // show the "Index" page
}
function Send($n) {
var_dump(__FUNCTION__, func_get_args()); // placeholder controller
}
function Receive($n) {
var_dump(__FUNCTION__, func_get_args()); // placeholder controller
}
function Not_Found() {
var_dump(__FUNCTION__); // show a "404 - Not Found" page
}
以及以下基于正则表达式的Route() 函数:
function Route($route, $function = null)
{
$result = rtrim(preg_replace('~/+~', '/', substr($_SERVER['PHP_SELF'], strlen($_SERVER['SCRIPT_NAME']))), '/');
if (preg_match('~' . rtrim(str_replace(array(':any', ':num'), array('[^/]+', '[0-9]+'), $route), '/') . '$~i', $result, $matches) > 0)
{
exit(call_user_func_array($function, array_slice($matches, 1)));
}
return false;
}
现在我想将以下 URL(尾斜杠被忽略)映射到相应的“控制器”:
/index.php -> Index()
/index.php/send/:NUM -> Send()
/index.php/receive/:NUM -> Receive()
/index.php/NON_EXISTENT -> Not_Found()
这是事情开始变得棘手的部分,我有两个问题我无法解决......我想我不是第一个遇到这个问题的人,所以那里的人应该有解决方案。
捕获 404(已解决!)
我找不到一种方法来区分对根 (index.php) 的请求和不应该存在的请求 (index.php/notHere)。我最终为 URL 提供默认的 index.php 路由,否则应该提供 404 - Not Found 错误页面。 我该如何解决?
编辑 - 我脑海中闪过的解决方案:
Route('/send/(:num)', 'Send');
Route('/receive/(:num)', 'Receive');
Route('/:any', 'Not_Found'); // use :any here, see the problem bellow
Route('/', 'Index');
路线的顺序
如果我按“逻辑”顺序设置路线,如下所示:
Route('/', 'Index');
Route('/send/(:num)', 'Send');
Route('/receive/(:num)', 'Receive');
Route(':any', 'Not_Found');
所有 URL 请求都被 Index() 控制器捕获,因为空的正则表达式(记住:尾部斜杠被忽略)匹配所有内容。但是,如果我以“hacky”顺序定义路由,如下所示:
Route('/send/(:num)', 'Send');
Route('/receive/(:num)', 'Receive');
Route('/:any', 'Not_Found');
Route('/', 'Index');
一切似乎都可以正常工作。 有解决这个问题的优雅方法吗?
路由可能并不总是被硬编码(从数据库或其他东西中提取),我需要确保它不会因为定义的顺序而忽略任何路由。 感谢您的帮助!
【问题讨论】:
标签: php regex routing controller routes