Zend framework2 ZF2获取url参数并在调度错误事件时重定向

Zend framework2 ZF2获取url参数并在调度错误事件时重定向,zend-framework2,Zend Framework2,我有代码来改变网站的语言。我想扩展这个函数。我希望在获取404页面(或dispatch_error事件)时确保url中的语言参数正确 我的路线示例 'about' => array( 'type' => 'Segment', 'options' => array( 'route' => '/[:lang/]about', 'constraints' =&g

我有代码来改变网站的语言。我想扩展这个函数。我希望在获取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参数不正确(example.com/e/about或exampleDotcom//about),则重定向到特定页面(例如example.com/why_dot_发生)。为了做到这一点,我创建了一个函数checkRedirect,并将其附加到EVENT_DISPATCH_ERROR。但是我不知道如何从url获取LANG参数,然后进行重定向。我试过很多次,但都做不到。我对非对象上的成员函数getParam()进行了-Call。我应该向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
}
这确实有效,但“名称”,但必须是路由中给定的名称

'route'    => '/[:lang/]about',
但是,上述路线与路线不匹配*example.com/why_\u it_*

试着把你的路线改成

'route'    => '[/:lang]/about',
如果没有提供lang,您总是可以默认设置,即

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

谢谢你的回答。我已经将路由更改为
'route'=>'[/:lang]/about',
并添加了代码
公共函数checkRedirect(MvcEvent$e){$e->getRouteMatch()->getParam('lang');}
但我仍然需要对非对象上的成员functon getParam()进行
调用。。。PS
$e->getRouteMatch()->getParam('lang','en')也不起作用。
$e->getRouteMatch()->getParam('lang', 'en');