Реализация Zend_Locale и Zend_Translate с модулями

Я искал в Интернете хорошее решение для интеграции Zend_Locale и Zend_Translate в модульную структуру. Вот конечный путь, который я хочу:

http://url/:lang/:module/:controller/:action
http://url/:lang/:controller/:action
http://url/:module/:controller/:action ‹= следует прибегать на локаль по умолчанию

Я видел много руководств по использованию маршрутизаторов, но ни одно из них не работает для меня. Может кто-нибудь, пожалуйста, просто решить это для меня.

Спасибо!


person somejkuser    schedule 03.12.2011    source источник


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

person bedeabza    schedule 24.07.2012