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

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

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

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

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

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

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

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


person blackbishop    schedule 13.08.2013    source источник


Ответы (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(), но IMVHO onBootstrap СЛИШКОМ РАНО для получения matched route, которое требуется для определения локали/языка, переданного клиентом в параметре маршрута/url.

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

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

person Thomas Szteliga    schedule 17.12.2013

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

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

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

person Adrian    schedule 14.08.2013