Реализация Zend_Locale и Zend_Translate с модулями
Я искал в Интернете хорошее решение для интеграции Zend_Locale и Zend_Translate в модульную структуру. Вот конечный путь, который я хочу:
HTTP: // URL /: языки /: модуль /: контроллер /: действие
HTTP: // URL /: языки /: контроллер /: действие
http://url/:module/:controller/:action <= должен использовать локаль по умолчанию
Я видел много уроков, использующих маршрутизаторы, но ни один из них мне не подходит. Может кто-нибудь, пожалуйста, просто решить это для меня.
Спасибо!
1 ответ
Первая проблема здесь заключается в том, что при использовании маршрутов вам необходимо иметь очень конкретные ограничения, чтобы сопоставить правила с таким количеством переменных.
Я предлагаю вместо принятия обоих // 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 только двумя буквенными словами, но это может вызвать проблемы, и я предпочитаю избегать этого.