在zend框架2中动态更改默认路由参数?

时间:2013-08-13 15:14:26

标签: zend-framework2 zend-route zend-translate

我需要动态更改语言应用程序。 我有以下路线配置:

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

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

是否可以从我的控制器或我的Module.php(函数onBootstrap)更改参数'lang'。我不知道我是否可以使用全局变量或类似的东西。

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

如果有可能,我该如何更改?

谢谢你的帮助!

2 个答案:

答案 0 :(得分:3)

我遇到了类似的问题并想出来了,试试:

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

我在MvcEvent :: EVENT_DISPATCH(请参阅下面的更新说明)中使用监听器触发此操作,但Module.php中的onBootstrap也应该正常工作。

<强>更新

好的,现在我看到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 / query字符串的任何脏字符串操作,我正在考虑匹配上的干净getParam()路由。

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

答案 1 :(得分:1)

您的路线设置方式总是需要包含lang参数来访​​问默认控制器以外的任何其他内容。

网址:'/'将包含lang'en'和控制器'default'等。 网址:'/ es'将包含lang值'es'和控制器'default' 网址:'/ es / about'将包含lang值'es'和控制器'about' URL:'/ about'会尝试将lang设置为'about',并可能会破坏路径。

你可以&amp;应该在Module :: onBootstrap中更改翻译器的语言代码。您可以通过MvcEvent对象访问路由参数。