Динамически изменить параметры маршрута по умолчанию в 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.