Mez*_*Mez 18 php url routing url-routing
所以我正在编写一个框架,我想在其上建立一些我正在研究的应用程序(框架就在那里,所以我有一个可以使用的环境,以及一个让我可以使用单个系统的系统登录)
我想制作这个框架,并且它使用的应用程序使用资源导向架构.
现在,我想创建一个可由APP编写者扩展的URL路由类(也可能是CMS App用户可扩展的,但是未来的WAYYYY也是如此),我试图找出最好的方法来实现它其他应用如何做到这一点.
gra*_*bot 14
我更喜欢使用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",
));
Run Code Online (Sandbox Code Playgroud)
为了减少错误和简化你可以细分你的表.这样,您可以将路由表放入它控制的类中.以上面的示例为例,您可以将三个线程调用合并为一个.
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",
));
Run Code Online (Sandbox Code Playgroud)
然后你定义ThreadController :: route就像这样.
function route($args) {
Route::process($args['uri'], array(
"#^(.*)/post$#Di" => "ThreadController/post/title",
"#^(.*)/reply$#Di" => "ThreadController/reply/title",
"#^(.*)$#Di" => "ThreadController/thread/title",
));
}
Run Code Online (Sandbox Code Playgroud)
您还可以在右侧为路由字符串定义所需的默认值.只是不要忘记记录它们,否则你会混淆人们.如果你没有在右边包含一个函数名,我正在调用index.这是我目前的代码.您可能希望更改它以处理您喜欢的错误和/或默认操作.