PHP 应用程序 URL 路由

2022-08-30 21:19:22

因此,我正在编写一个框架,我想基于该框架来构建我正在处理的一些应用程序(该框架就在那里,因此我有一个可以使用的环境,以及一个允许我使用单点登录的系统)

我想制作这个框架,它的应用程序使用面向资源的架构。

现在,我想创建一个URL路由类,该类可由APP编写者扩展(也可能由CMS App用户扩展,但这将是未来的WAYYYY),并且我正在尝试通过查看其他应用程序如何做到这一点来找出最好的方法。


答案 1

我更喜欢使用reg ex而不是制作自己的格式,因为它是常识。我写了一个小类,我使用它,它允许我嵌套这些reg ex路由表。我曾经使用通过继承实现的类似的东西,但它不需要继承,所以我重写了它。

我在键上执行 reg ex 并映射到我自己的控件字符串。以下面的例子为例。我访问,我的路由器类创建一个新对象并调用它的方法/api/related/joeApiControllerrelatedDocuments(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",
    ));
}

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


答案 2

还有另一个框架?-- 无论如何...

路由的诀窍是将其全部传递到路由控制器。

您可能希望使用类似于我在这里记录的内容:

http://www.hm2k.com/posts/friendly-urls

第二种解决方案允许您使用类似于Zend Framework的URL。


推荐