Маршрутизация в Zend Framework 2, пропустить действие index в URL, но получить идентификатор
У меня есть контроллер, который может быть вызван как modulename/xmlcoverage
с index
действие и некоторые другие действия, скажем testAction()
, URL-адрес этого контроллера xml/coverage
,
Тогда по умолчанию xml/coverage
сопоставляет с моим действием индекса. И это xml/coverage/test
сопоставляет с testAction. Если мне нужен идентификатор для testAction, URL будет выглядеть так: xml/coverage/test/33
например.
Однако для действия с индексом это должно быть xml/coverage/index/33
Где бы я хотел, чтобы это было xml/coverage/33
,
Это мой маршрут
'xmlcoverage' => array(
'type' => 'segment',
'options' => array(
'route' => '/xml/coverage[/:action][/:id]',
'constraints' => array(
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'id' => '[0-9]+',
),
'defaults' => array(
'controller' => 'modulename/xmlcoverage',
'action' => 'index',
),
),
),
Когда я пытаюсь использовать URL xml/cover /33, я считаю, что 33 должен отображаться на id, так как он не соответствует регулярному выражению действия, и оба являются необязательными. А поскольку он не соответствует действию, следует использовать значение по умолчанию (индекс).
Вместо этого я получаю сообщение о том, что URL не может быть сопоставлен маршрутизацией. Так что для меня это действует так, как если бы маршрут был '/xml/coverage[/:action[/:id]]'
потому что я по какой-то причине должен указать действие для его распознавания идентификатора.
Что я делаю не так, и как я могу заставить URL работать так, как мне хочется? Благодарю.
РЕДАКТИРОВАТЬ: Вот проблема. Делаем это на мой взгляд:
$this->url('xmlcoverage', array('action' => 'index', 'id' => $someid))
на самом деле дает URL в форме xml/coverage/1
который потерпит крах! Изменение маршрута на /xml/coverage[/:action[/:id]]
по крайней мере заставит помощника URL производить рабочие URL.
1 ответ
После разговора и отладки с замечательными людьми из ZF2 в IRC мы обнаружили ошибку в маршрутизации.
Во время обсуждения я сделал небольшой пример к моей проблеме, которая здесь. Как вы можете видеть из дампа var здесь, действие теряется во втором случае, когда оно должно по умолчанию "index".
Но если кому-то нужна эта функциональность для работы прямо сейчас, вот способы, как это исправить:
- Вместо того, чтобы маршрут
/test[/:action][/:id]
иметь это быть/test[/:action[/:id]]
, тогда помощник URL добавит /index/ и, по крайней мере, это работает. - Создайте новый маршрут, где вы только слушаете
/test[/:id]
в дополнение к другому. - В вашем контроллере сделаем
public function notFoundAction() { $view = new ViewModel($this->indexAction()); //etc}
Вроде хаки, но с этим багом он отправит не найденное действие, которое вы можете использовать в качестве дополнения.