0

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

/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+"),

它匹配所有三个 url 的第一条路由。

我试过这样做:

        '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 url 规则中是否有办法“封装” :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

4

1 回答 1

0

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

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

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

/user/(\d+)\.json$
于 2012-09-20T11:16:43.963 回答