我更喜欢使用 reg ex 而不是制作自己的格式,因为这是常识。我编写了一个小类,我使用它允许我嵌套这些 reg ex 路由表。我曾经使用类似的通过继承实现的东西,但它不需要继承,所以我重写了它。
我在一个键上执行 reg ex 并映射到我自己的控制字符串。以下面的例子为例。我参观/api/related/joe
我的路由器类创建了一个新对象ApiController
并调用它的方法relatedDocuments(array('tags' => 'joe'));
// the 12 strips the subdirectory my app is running in
$index = urldecode(substr($_SERVER["REQUEST_URI"], 12));
Route::process($index, array(
"#^api/related/(.*)$#Di" => "ApiController/relatedDocuments/tags",
"#^thread/(.*)/post$#Di" => "ThreadController/post/title",
"#^thread/(.*)/reply$#Di" => "ThreadController/reply/title",
"#^thread/(.*)$#Di" => "ThreadController/thread/title",
"#^ajax/tag/(.*)/(.*)$#Di" => "TagController/add/id/tags",
"#^ajax/reply/(.*)/post$#Di"=> "ThreadController/ajaxPost/id",
"#^ajax/reply/(.*)$#Di" => "ArticleController/newReply/id",
"#^ajax/toggle/(.*)$#Di" => "ApiController/toggle/toggle",
"#^$#Di" => "HomeController",
));
为了减少错误并提高简单性,您可以细分表格。这样你就可以将路由表放入它控制的类中。以上面的示例为例,您可以将三个线程调用合并为一个。
Route::process($index, array(
"#^api/related/(.*)$#Di" => "ApiController/relatedDocuments/tags",
"#^thread/(.*)$#Di" => "ThreadController/route/uri",
"#^ajax/tag/(.*)/(.*)$#Di" => "TagController/add/id/tags",
"#^ajax/reply/(.*)/post$#Di"=> "ThreadController/ajaxPost/id",
"#^ajax/reply/(.*)$#Di" => "ArticleController/newReply/id",
"#^ajax/toggle/(.*)$#Di" => "ApiController/toggle/toggle",
"#^$#Di" => "HomeController",
));
然后你定义 ThreadController::route 如下。
function route($args) {
Route::process($args['uri'], array(
"#^(.*)/post$#Di" => "ThreadController/post/title",
"#^(.*)/reply$#Di" => "ThreadController/reply/title",
"#^(.*)$#Di" => "ThreadController/thread/title",
));
}
您还可以为右侧的路由字符串定义任何默认值。只是不要忘记记录它们,否则你会让人们感到困惑。如果右侧不包含函数名称,我当前正在调用索引。Here http://pastie.org/278748是我当前的代码。您可能希望更改它以按照您喜欢的方式处理错误和/或默认操作。