Первая проблема здесь заключается в том, что при использовании маршрутов вам нужно иметь очень специфические ограничения, чтобы сопоставлять правила с таким количеством переменных.
Я предлагаю вместо того, чтобы принимать как //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 только двумя буквами, но это создаст проблемы, и я предпочитаю этого избегать.
person
bedeabza
schedule
24.07.2012