5

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

module.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', 
           ], 
          ], 
         ], 
       ], 
      ], 
     ], 
    ], 

module.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 не может быть сопоставлен с помощью маршрутизации.

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

+1

Согласно документации и что мы можем найти на SO (какой-то код в точности такой же), Кажется, ОК. Вы обнаружили, что было не так с тех пор, как вы опубликовали этот вопрос? –

+0

@AlFonce да, я нашел одно, что «hinzufügen» не работает, но «hinzufugen» работает, и если вы нашли лучший способ решить перевод URL, чем, пожалуйста, дайте мне знать. Благодаря!! – khukuri

ответ

0

Я переписан код в 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

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

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

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

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

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

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

Смежные вопросы