Первая проблема здесь заключается в том, что при использовании маршрутов вам нужно иметь очень специфические ограничения, чтобы сопоставить правила с таким количеством переменных.
Я предлагаю вместо принятия обоих // url /: lang /: module/: controller /: action и // url /: module /: controller /: action устанавливаются для использования только первой структуры.Таким образом, будет легче изолировать первое правило от этого действия // url /: lang /: controller /: action, имеющее только 2 правила, каждое из которых имеет разные слова (части URL).
$withModule = new Zend_Controller_Router_Route(
':lang/:module/:controller/:action',
array()
);
$withoutModule = new Zend_Controller_Router_Route(
':lang/:controller/:action',
array(
'module' => 'default'
)
);
$router->addRoute('withModule', $withModule);
$router->addRoute('withoutModule', $withoutModule);
В первом маршруте вы не указываете никаких значений по умолчанию, поэтому он не соответствует URL-адресам, предназначенным для второго, в то время как во втором маршруте вы задаете модуль по умолчанию (потому что ZF нуждается в этой информации).
Какдля третьего правила я предлагаю использовать контроллер базового предка, что-то вроде MyLib_Controller, и в его методе init () проверить, получен ли языковой параметр, как в примере ниже:
if(!$this->_getParam('lang')) {
//this should cover the 3rd use case
$this->_redirect('/en/' + $this->view->url(), array('exit' => true, 'prependBase' => false));
} else {
//setup Zend_Translate
}
Другая возможность ограничивает: переменная lang только для двухбуквенных слов, но это может вызвать проблемы, и я предпочитаю ее избегать.