当前位置:  开发笔记 > 编程语言 > 正文

PHP应用程序URL路由

如何解决《PHP应用程序URL路由》经验,为你挑选了1个好方法。

所以我正在编写一个框架,我想在其上建立一些我正在研究的应用程序(框架就在那里,所以我有一个可以使用的环境,以及一个让我可以使用单个系统的系统登录)

我想制作这个框架,并且它使用的应用程序使用资源导向架构.

现在,我想创建一个可由APP编写者扩展的URL路由类(也可能是CMS App用户可扩展的,但是未来的WAYYYY也是如此),我试图找出最好的方法来实现它其他应用如何做到这一点.



1> gradbot..:

我更喜欢使用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.这是我目前的代码.您可能希望更改它以处理您喜欢的错误和/或默认操作.

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有