我需要创建一个简单的路由机制,它接受如下命令:/ foo / bar并将其转换为FooController-> barAction();我必须使用单个脚本作为访问点来加载这些控制器类和操作方法。我也不能使用任何外部框架或库来完成这项任务。这需要能够在带有Apache的PHP 5.3服务器上运行。
以下是我已经写过的内容,但我无法将其付诸实践:
class Router {
private static $routes = array();
private function __construct() {}
private function __clone() {}
public static function route($pattern, $callback) {
$pattern = '/' . str_replace('/', '\/', $pattern) . '/';
self::$routes[$pattern] = $callback;
}
public static function execute() {
$url = $_SERVER['REQUEST_URI'];
$base = str_replace('\\', '/', dirname($_SERVER['SCRIPT_NAME']));
if (strpos($url, $base) === 0) {
$url = substr($url, strlen($base));
}
foreach (self::$routes as $pattern => $callback) {
if (preg_match($pattern, $url, $params)) {
array_shift($params);
return call_user_func_array($callback, array_values($params));
}
}
}
}
我正在尝试至少执行基于另一个简单路由器的当前脚本,但我实际上无法使用
获取输出Router::route('blog/(\w+)/(\d+)', function($category, $id){
print $category . ':' . $id;
});
Router::execute();
答案 0 :(得分:1)
而不是试图突破PATH。为什么不改用.htaccess。
所以你可以拥有如下所示的内部网址:
index.php?module=MODULE&action=INDEX
然后使用.htaccess提供URL中的路径并相应地路由它们。
www.mydomain.com/MODULE/INDEX
这篇文章可以帮助您重写regex for creating pritty urls in htaccess
可能有一个更好的,只是一个快速的谷歌搜索。
这样你可以像这样访问:
$module = $_GET['module'];
$action = $_GET['action];
然后,您可以检查路由器中的相应操作,以检查它是否存在,然后相应地重新路由。