5

Tôi mới tham gia khung công tác Zend 3 và đang cố dịch các tuyến đường và tôi đã thành công một phần. Tôi có thể dịch tuyến đường chính và chuyển hướng đến vị trí được yêu cầu nhưng con đường dịch các công trình nhưng chuyển hướng không. bạn có thể vui lòng giúp tôi, mã của tôi là dưới đây.Zend framework không thể định tuyến các tuyến con đã dịch

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')); 
    } 

Và tập tin ngôn ngữ của tôi de_De.php

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

Theo mã trên tôi i am có thể chuyển hướng đến Trình điều khiển cài đặt với tuyến đường "language.devgrafioffshore.com/de/Einstellung "

Nhưng không thể chuyển hướng đến language.devgrafioffshore.com/de/Einstellung/hinzufügen mà nên chuyển hướng tôi để thêm hành động nhưng tôi nhận được

URL được yêu cầu không thể được xuất hiện bằng cách định tuyến.

Cảm ơn bạn trước. Tạm biệt!

+1

Theo tài liệu và những gì chúng tôi có thể tìm thấy trên SO (một số mã giống hệt nhau), Có vẻ như OK. Bạn đã tìm thấy những gì đã sai kể từ khi bạn đăng câu hỏi này? –

+0

@AlFonce vâng tôi tìm thấy một điều mà "hinzufügen" không hoạt động nhưng "hinzufugen" hoạt động và nếu bạn đã tìm thấy cách tốt hơn để giải quyết bản dịch url hơn hãy cho tôi biết. Cảm ơn!! – khukuri

Trả lời

0

Tôi đã viết lại mã của bạn trong zend framework2, hãy xem, tôi sẽ cố gắng 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_-]*' 
         ), 
        ), 
       ), 

      ) 

     ), 
    ), 

Các tuyến đường có thể thông qua cấu hình này là

setting/add/anyActionName

thiết lập/thêm/thêm

thiết lập/thêm/kiểm tra

Các add đầu tiên không phải là một hành động, chứ không phải nó hoạt động như một đường dẫn đến hành động. "Add" hoặc "anyActionName" thứ hai là các hành động bạn muốn thực hiện. Một điều tốt hơn với cấu hình này là, bạn có thể truyền ID cũng với tên hành động thông qua URL, nhưng nếu bạn không vượt qua bất kỳ ID nào thì không sao cả.

điều

Thêm một điều rất quan trọng, cấu hình được xác định theo cách này không giúp để xác định mỗi tên Action bởi vì với

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

ràng buộc này trên tên hành động, bất kỳ tên Action có thể trôi qua, trừ khi tên Action chứa bất kỳ ký tự đặc biệt nào. Nếu bạn có bất kỳ câu hỏi nào liên quan đến giải pháp của tôi, vui lòng hỏi.

Các vấn đề liên quan