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$