Динамически изменить параметры маршрута по умолчанию в Zend Framework 2?

Мне нужно динамически менять свое языковое приложение. У меня есть следующая конфигурация маршрута:

'route'    => '/[:lang[/:controller[/:action[/:id]]]][[/page/:page]]',

'defaults' => array(
'lang'     => 'en',
        ),

Можно ли изменить параметр "lang" из моего контроллера или из моего Module.php (функция onBootstrap). Я не знаю, могу ли я использовать глобальную переменную или что-то подобное.

'defaults' => array(
'lang'     => $my_variable,
        ),

Если это возможно, как я могу изменить это?

Спасибо за вашу помощь!

2 ответа

Решение

У меня была похожая проблема, и я понял, попробуйте:

$e->getRouter()->setDefaultParam('lang', 'de_DE');

Я запускаю это на MvcEvent::EVENT_DISPATCH (см. Примечание к обновлению ниже) с использованием слушателя, но onBootstrap в Module.php должно работать тоже.

Обновить:

Хорошо, теперь я вижу, что MvcEvent::EVENT_DISPATCH слишком поздно для применения параметра по умолчанию к маршрутизатору. Особенно, когда Вас интересует не только передача языка по маршруту, но и наличие переводимых маршрутов (в сочетании с 'router_class'=>'Zend\Mvc\Router\Http\TranslatorAwareTreeRouteStack').

Так должно быть на MvcEvent::EVENT_ROUTE:

// applying a default language param to route
$e->getRouter()->setDefaultParam('lang', 'de_DE');

// Now detect the requested language or retrieve 
// from matched route
// $detectedLocale =...
// ...

// Retrieve the translator
$sm->get('translator');

// Apply detected locale to the translator
$translator->setLocale($detectedLocale);

// and now this apply the translator to the router
// for translatable routes
$e->getRouter()->setTranslator($translator);

// but don't forget about
// 'router_class'=>'Zend\Mvc\Router\Http\TranslatorAwareTreeRouteStack'
// for translatable routes

Я вижу, как люди говорят, что ты должен сделать это в onBootstrap(), но имхо onBootstrap слишком рано для получения matched route, который требуется для определения локали / языка, переданного клиентом в параметре route / url.

Говоря "обнаружение локали", я определенно не думаю о каких-либо грязных строковых операциях над строкой URL / запроса, я имею в виду чистую getParam() на согласованном маршруте.

Связанный: http://framework.zend.com/manual/2.2/en/modules/zend.mvc.mvc-event.html

При настройке маршрута вам всегда нужно будет включить параметр lang, чтобы получить доступ к чему-либо, кроме контроллера по умолчанию.

URL: '/' будет иметь lang 'en' и контроллер 'default' и т. Д. URL: '/es' будет иметь значение lang 'es' и контроллер 'default' URL: '/es/about' будет иметь значение lang 'es' and controller 'about' URL: '/about'попытается установить для lang значение' about 'и, возможно, нарушить маршрут.

Вы можете и должны изменить код языка переводчика в Module::onBootstrap. Там у вас будет доступ к параметрам маршрута через объект MvcEvent.

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