Реализация 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 только двумя буквенными словами, но это может вызвать проблемы, и я предпочитаю избегать этого.

Другие вопросы по тегам