PHP路由系统

时间:2011-06-28 13:06:29

标签: php annotations url-routing

我正在尝试创建基于注释的路由系统(类似于Recess Framework)。

<?php

class MyController extends ActionController {

    /** !Route GET /hello/$firstname/$lastname **/
    public function helloAction($firstname, $lastname) {
        echo('Hello '.$firstname.' '.$lastname);
    }
}

?>

如果我去http://domain.com/hello/James/Bond

Hello James Bond

所以我有两个问题:

1)这是个好主意吗?利弊与集中路由系统(如Zend Framework)。也许我没有看到我后来使用这种路由技术出现的问题。

2)如果路线中有正则表达式,如何检查重复路线

<?php

class MyController extends ActionController {

    /** 
     *!Route GET /test/$id = {
     *    id: [a-z0-9]
     *}
     **/
    public function testAction($id) {
        echo($id);
    }

    /** 
     *!Route GET /test/$id = {
     *    id: [0-9a-z]
     *}
     **/
    public function otherTestAction($id) {
        echo($id);
    }
}

?>

我有两条路线:/test/[a-z0-9]//test/[0-9a-z]/如果我转到http://domain.com/test/a12/这两条路线都有效。

谢谢:)

4 个答案:

答案 0 :(得分:2)

尝试使用Java annotation format,这应该更容易统一解析。

它看起来像这样:

<?php   
class MyController extends ActionController {

    /**
       @Route(get=/hello/$firstname/$lastname)
       @OtherVal(var1=2,var2=foo)
       @OtherVal2
    **/
    public function helloAction($firstname, $lastname) {
        echo('Hello '.$firstname.' '.$lastname);
    }
}
?>

使用以下正则表达式解析注释:

@(?P<annotation>[A-Za-z0-9_]*)(\((?P<params>[^\)]*))?

当然,尽可能缓存这些内容以避免重复解析。

答案 1 :(得分:1)

缺点:

  • 可能很难概述服务器中所有方法的URL映射。
  • 要更改URL,您必须更改源代码,映射不会与应用程序分开。

如果方法签名和映射始终与示例相关,则可以使用反射来提取映射,其中 helloAction 被选为 / hello 和每个方法参数是定义它的顺序的子目录。

然后注释不需要复制URL,只需要该方法是端点的事实,如下所示:

<?php
    class MyController extends ActionController {

        /** !endpoint(method=GET) **/
        public function helloAction($firstname, $lastname) {
            echo('Hello '.$firstname.' '.$lastname);
        }
}

答案 2 :(得分:0)

  1. 我认为这是一个好主意/解耦代码和入口点似乎随处可见

  2. 通常你不会检查它:匹配胜利的第一个。

答案 3 :(得分:0)

这样做是个好主意,只要您在生产中缓存已编译的路径。在路由时解析文件会产生相关成本,因此您希望在不进行开发时避免使用该文件。

至于检查重复项,请不要通过比较声明进行检查。只需检查路由时间。如果两个规则匹配,则抛出DuplicateRouteException。因此,在路由http://domain.com/test/a12/时,您将看到两个路由都有效并抛出异常。