一尘不染

PHP应用程序URL路由

php

因此,我正在编写一个框架,我希望以此为基础来开发一些我正在使用的应用程序(该框架在那里,所以我有一个可以使用的环境,并且该系统可以让我使用例如一个登录)

我要创建这个框架,并且它的应用程序都使用面向资源的体系结构。

现在,我想创建一个URL路由类,该类可以由APP编写器(也可能由CMS App用户)扩展,但我想通过查看以下方法找出最佳方法:其他应用程序如何做到这一点。


阅读 326

收藏
2020-05-29

共1个答案

一尘不染

我更喜欢使用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",
    ));
}

您也可以在右侧为路由字符串定义任何默认值。只是不要忘了将它们记录下来,否则您将使人们感到困惑。如果您在右侧未包含函数名称,则当前正在调用索引。是我当前的代码。您可能需要更改它以处理您喜欢的错误和/或默认操作。

2020-05-29