Zend Routes:匹配

时间:2012-09-19 16:21:53

标签: zend-framework zend-route

我有这些需要工作的路线:

/user
/user/1
/user/1.json

目前我有

        'user'              => array('key' => 'user', 'controller' => 'user'),
        'user/:id'          => array('key' => 'user-id', 'controller' => 'user', 'id' => "\d+"),
        'user/:id.json'     => array('key' => 'user-id-json', 'controller' => 'user', 'id' => "\d+"),

它匹配所有三个网址的第一条路线。

我试过这样做:

        'user'              => array('key' => 'user', 'controller' => 'user'),
        'user/"\d+"'            => array('key' => 'user-id', 'controller' => 'user', 'id' => 1),
        'user/"\d+".json'   => array('key' => 'user-id-json', 'controller' => 'user', 'id' => 1),

但只有第一条路线仍匹配

在Zend Route网址规则中是否有一种方法可以“封装”:id以便将其选中并允许我放置/之后的其他内容?


已更新

我的引导程序使用:

public function _initRoutes() {
    $this->addRoutes(array(
        'client'            => array('key' => 'client', 'controller' => 'client'),
        'client/:id'        => array('key' => 'client-id', 'controller' => 'client', 'id' => "\d+"),
        'user'          => array('key' => 'user', 'controller' => 'user'),
        'user/:id'      => array('key' => 'user-id', 'controller' => 'user', 'id' => "\d+")
    ));
}

我的扩展扩展程序使用

public function addRoutes($routes) {
    $router = Zend_Controller_Front::getInstance()->getRouter();
    foreach ($routes as $pattern => $data) {
        $router->addRoute(
            $data['key'],
            new Zend_Controller_Router_Route(
                $pattern,
                array('controller' => $data['controller'])
            )
        );
    }
}

我尝试过制作addRoutes:

public function addRoutes($routes) {
    $router = Zend_Controller_Front::getInstance()->getRouter();
    foreach ($routes as $pattern => $data) {
        $router->addRoute(
            $data['key'],
            new Zend_Controller_Router_Route(
                $pattern,
                array('controller' => $data['controller'])
            )
        );
        $router->addRoute(
                $data['key'].'-json',
                new Zend_Controller_Router_Route(
                        $pattern.'.json',
                        array('controller' => $data['controller'])
                )
        );

    }
}

但后者取消了/ user / 50例如

1 个答案:

答案 0 :(得分:0)

首先,不要试图在一条路线上完成这一切;你可以有多个命名路线指向同一个地方。如果你试图为一条路线定义这个,那么从大块中就不清楚了。如果是,请将规则拆分为三个,并为它们提供相同的变量。

如果您的路由是在ini文件中定义的(按惯例,路由.ini),那么我发现更容易使用/ user /:id /:format。然后,您可以在控制器中使用Zend contextSwitcher帮助程序,或者只使用:format作为应用程序的提示。在你的路线的reqs部分,你应该有(\ d +)Zend_Route寻找子字符串。

如果做不到这一点,你可以逃脱:id:file并将.json定义为该特定路线的req。如果您必须具有文件扩展名,则可能会有效。但是,由于您通过将PHP脚本作为json提供服务来欺骗用户,因此可以在Web服务器级别更好地处理。如果所有其他方法都失败了,并且您的正则表达式foo取决于它,则创建一个Regex路由器的实例。虽然这是未经测试的,但这可能会这样做:

/user/(\d+)\.json$