2013-08-13 3 views
2

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

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

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

Можно ли изменить параметр «язык» от моего контроллера или от моей module.php (функция onBootstrap). Я не знаю, могу ли я использовать переменную globale или что-то подобное.

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

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

Thaks для вашей помощи!

ответ

3

У меня была аналогичная проблема, и понял это, попробуйте:

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

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

Update:

Хорошо, теперь я вижу, что 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, который необходим для обнаружения язык/язык, переданный клиентом в параметре route/url.

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

http://framework.zend.com/manual/2.2/en/modules/zend.mvc.mvc-event.html

1

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

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

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