ZF2获取url param并重定向dispatch_error事件

时间:2014-03-20 16:08:26

标签: zend-framework2

我有更改网站语言的代码。我想扩展这个功能。我想确保当我获得404页面(或dispatch_error事件)时,url中的语言参数是正确的。

我的路线示例

'about' => array(
            'type' => 'Segment',
            'options' => array(
                'route'    => '/[:lang/]about',
                'constraints' => array(
                      'lang' => '[a-zA-Z]{2}?',
                ),
                'defaults' => array(
                    'controller' => 'Application\Controller\Index',
                    'action'     => 'about',
                    'lang'       => 'en',
                ),
            ),
        ),

如果url param不正确(example.com/e/about或exampleDotcom // about),则会重定向到特定页面(例如example.com/why_did_it_happen)。为此,我创建了一个函数checkRedirect并将其附加到EVENT_DISPATCH_ERROR。但是如何从url获取LANG参数然后进行重定向,我不知道。我试过多次,但不能。我有 - 在非对象上调用成员函数getParam()。我会在checkRedirect函数中添加什么代码来从url获取LANG参数,然后在此函数中进行重定向?

我在Module.php中的代码

class Module implements 
AutoloaderProviderInterface,
ConfigProviderInterface,
ViewHelperProviderInterface {

public function onBootstrap(MvcEvent $e) {
    $eventManager = $e->getApplication()->getEventManager();
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);
    $eventManager->attach(MvcEvent::EVENT_ROUTE, array($this, 'initLocale'), -100);
    $eventManager->attach(MvcEvent::EVENT_DISPATCH_ERROR, array($this, 'checkRedirect'), -101);
    $eventManager->attach(MvcEvent::EVENT_DISPATCH, array($this, 'preDispatch'), 100);
}

public function initLocale(MvcEvent $e) {
    $translator = $e->getApplication()->getServiceManager()->get('translator');        
    $config = $e->getApplication()->getServiceManager()->get('Config');
    $shotLang = $e->getRouteMatch()->getParam('lang'); //or $e->getApplication()->getMvcEvent()->getRouteMatch();
    if (isset($config['languages'][$shotLang])) {
        $translator->setLocale($config['languages'][$shotLang]['locale']);
    } else {
        $lang = array_shift($config['languages']);
        $translator->setLocale($lang['locale']);
    }
}

public function checkRedirect(MvcEvent $e) {
   //code here
}

1 个答案:

答案 0 :(得分:1)

$e->getRouteMatch()->getParam('NAME')

这确实有效,但是'NAME',但是是路线中给出的名称。

'route'    => '/[:lang/]about',

但是,上述路线与路线不匹配* example.com / why_did_it_happen *

尝试将路线更改为

'route'    => '[/:lang]/about',

如果没有提供lang,你可以随时默认,即

$e->getRouteMatch()->getParam('lang', 'en');