Zend框架无法路由已翻译的子路由

时间:2016-07-28 04:17:19

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

我是Zend框架3的新手并且正在尝试翻译路线并且我已经部分成功。我能够翻译主路线并将其重定向到所需位置但是对于子路线,翻译工作但是重定向不是吨。能帮到我吗,我的代码在下面。

module.config.php

{ someOtherKey:{} }

Module.php

'router' => [
        'router_class'           => TranslatorAwareTreeRouteStack::class,
        'routes' => [
            'setting' => [
                'type'    => Segment::class,
                'options' => [
                    'route' => '/{locale}/{setting}',

                    'defaults' => [
                        'locale'     => 'de',
                        'controller' => Controller\SettingController::class,
                        'action'     => 'index',
                    ],
                ],

                'may_terminate'=>true,
                 'child_routes' =>[
                        'add' =>[
                            'type'      =>'Segment',
                            'options'   =>[
                                'route'         =>'/{add}',
                                'defaults'=> [
                                     'controller' => Controller\SettingController::class,
                                     'action'     => 'add',
                                ],
                            ],  
                        ],
                 ],
            ],
        ],
    ],

我的语言文件de_De.php

   public function onBootstrap(MvcEvent $e)
    {
        $eventManager        = $e->getApplication()->getEventManager();
        $moduleRouteListener = new ModuleRouteListener();
        $moduleRouteListener->attach($eventManager);

        $language_session = new Container('language');

        if(!$language_session->offsetExists('lang')){

           $language = 'de_DE';

        } else{

            $language = $language_session->lang.'_'.strtoupper($language_session->lang);
        }

        $translator = $e->getApplication()->getServiceManager()->get('translator');
        $translator->setLocale($language); 
        $translator->addTranslationFile('phparray', __DIR__.'/language/'.$language.'.php', 'default',$language);

        $app      = $e->getTarget();
        $app->getEventManager()->attach('route', array($this, 'onPreRoute'), 100);
    }

    public function onPreRoute($e)
    {
        $app      = $e->getTarget();
        $serviceManager       = $app->getServiceManager();
        $serviceManager->get('router')->setTranslator($serviceManager->get('translator'));
    }

根据我的上述代码,我可以使用“ language.devgrafioffshore.com/de/Einstellung ”路线重定向到设置控制器

但无法重定向到 language.devgrafioffshore.com/de/Einstellung/hinzufügen应该重定向我添加操作但我得到了

路由无法匹配请求的网址。

提前谢谢你。 再见!

1 个答案:

答案 0 :(得分:1)

  

我已经在zend framework2中重写了你的代码,看看,我会尝试expalin

'router' => array(
    'routes' => array(
        'setting' => array(
            'type'    => 'Literal',
            'options' => array(
                'route'    => '/setting',
                'defaults' => array(
                    '__NAMESPACE__' => '<<MODULE NAME HERE>>\Controller',
                    'controller'    => 'SettingController',
                    'action'        => 'index',
                ),
            ),
            'may_terminate' => true,
            'child_routes' => array(
                'add' => array(
                    'type'    => 'Segment',
                    'options' => array(
                        'route'    => '/add[/:action[/:id]]',
                        'constraints' => array(
                            'action'     => '[a-zA-Z][a-zA-Z0-9_-]*'
                        ),
                    ),
                ),

            )

        ),
    ),
  

通过此配置的可能路线是

<强> 设置/添加/ anyActionName

<强>设置/添加/添加

<强> 设置/添加/测试

  

第一个添加不是动作,而是充当行动路径。第二个“add”或“anyActionName”是您要执行的操作。使用此配置更好的是,您可以通过URL传递ID,但是如果您没有传递任何ID,那就没关系。

     

另一个非常重要的事情,以这种方式定义的配置有助于不定义每个Action名称,因为使用

'constraints' => array(
                            'action'     => '[a-zA-Z][a-zA-Z0-9_-]*'
                        ),
  

对操作名称的此约束,除非操作名称包含任何特殊字符,否则可以传递任何操作名称。如果您对我的解决方案有任何疑问,请随时提出。