我有更改网站语言的代码。我想扩展这个功能。我想确保当我获得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
}
答案 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');