Zend Routes: Соответствие

У меня есть эти маршруты, которые мне нужны для работы:

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

но только первый маршрут соответствует

Есть ли в правиле URL 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'])
                )
        );

    }
}

но последний отменяет / пользователь /50, например

1 ответ

Во-первых, не пытайтесь делать все это одним путем; Вы можете иметь несколько именованных маршрутов, которые указывают вам на одно и то же место. Из кусков не ясно, пытаетесь ли вы определить это для одного маршрута. Если да, разделите ваши правила на три и присвойте им одинаковые переменные.

Если ваши маршруты определены в INI-файле (по соглашению, маршруты. INI), то мне проще иметь что-то вроде /user/:id/:format. Затем вы можете использовать помощник Zend contextSwitcher в контроллере или просто использовать формат: как подсказку для вашего приложения. В разделе reqs вашего маршрута у вас должно быть (\d+), поскольку Zend_Route ищет подстроки.

В противном случае вы можете обойтись без:id:file и определить.json в качестве требования для данного конкретного маршрута. Это может работать, если у вас есть расширение файла. Однако, поскольку вы дурачите пользователя, предоставляя PHP-скрипт в качестве json, это может быть лучше обработано на уровне веб-сервера. Если ничего не помогает, и ваше регулярное выражение foo готово, создайте экземпляр маршрутизатора Regex. Пока это не проверено, это может сделать это:

/user/(\d+)\.json$
Другие вопросы по тегам