Структура Zend не может маршрутизировать переведенные дочерние маршруты

Я новичок в Zend framework 3 и пытался перевести маршруты, и мне это частично удалось. Я могу перевести основной маршрут и перенаправить его в нужное место, но для дочерних маршрутов перевод работает, а перенаправление - нет. не могли бы вы помочь мне, мой код ниже.

модуль.config.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',
                                ],
                            ],  
                        ],
                 ],
            ],
        ],
    ],

Модуль.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'));
    }

И мой языковой файл de_De.php

return array(
    'locale'  => 'de',
    'setting' => 'Einstellung',
    'add'     => 'hinzufügen',
);

В соответствии с моим приведенным выше кодом я могу перенаправить на контроллер настроек с маршрутом «language.devgrafioffshore.com/de/Einstellung»

Но не могу перенаправить на language.devgrafioffshore.com/de/Einstellung/hinzufügen, что должно перенаправить меня, чтобы добавить действие, но я получаю

Запрошенный URL-адрес не может быть сопоставлен маршрутизацией.

Заранее спасибо. Пока!


person khukuri    schedule 28.07.2016    source источник
comment
Согласно документации и тому, что мы можем найти на SO (некоторые коды точно такие же), кажется, все в порядке. Вы нашли, что было не так, так как вы опубликовали этот вопрос?   -  person Al Foиce ѫ    schedule 11.08.2016
comment
@AlFonce да, я обнаружил одну вещь, что hinzufügen не работает, но hinzufugen работает, и если вы нашли лучший способ решить перевод URL-адреса, пожалуйста, дайте мне знать. Спасибо!!   -  person khukuri    schedule 12.08.2016


Ответы (1)


Я переписал твой код в zend framework2, посмотри, попробую объяснить

'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_-]*'
                        ),
                    ),
                ),

            )

        ),
    ),

Возможные маршруты через эту конфигурацию:

setting/add/anyActionName

настройка/добавить/добавить

настройка/добавление/проверка

Первое добавление — это не действие, а скорее путь к действию. Второй add или anyActionName — это действия, которые вы хотите выполнить. Гораздо лучше в этой конфигурации то, что вы можете передавать идентификаторы также с именем действия через URL-адрес, но если вы не передаете никакого идентификатора, все в порядке.

Еще одна очень важная вещь. Конфигурация, определенная таким образом, помогает не определять каждое имя действия, потому что с

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

это ограничение на имя действия, любое имя действия может быть передано, если только имя действия не содержит каких-либо специальных символов. Если у вас есть какие-либо вопросы относительно моего решения, не стесняйтесь спрашивать.

person Seeker    schedule 27.01.2017