所以我正在编写一个框架,我想在其上建立一些我正在研究的应用程序(框架就在那里,所以我有一个可以使用的环境,以及一个让我可以使用单个系统的系统登录)
我想制作这个框架,并且它使用的应用程序使用资源导向架构.
现在,我想创建一个可由APP编写者扩展的URL路由类(也可能是CMS App用户可扩展的,但是未来的WAYYYY也是如此),我试图找出最好的方法来实现它其他应用如何做到这一点.
我更喜欢使用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", )); }
您还可以在右侧为路由字符串定义所需的默认值.只是不要忘记记录它们,否则你会混淆人们.如果你没有在右边包含一个函数名,我正在调用index.这是我目前的代码.您可能希望更改它以处理您喜欢的错误和/或默认操作.