2017-04-18 35 views
0

我想和一個可選的[郎鹹平]參數將用於設置應用程序的語言創建如下路線:與段類別的子路由ZF3可選參數並不想匹配

默認實例朗PARAM(EN例如)

domain.tld/ 
domain.tld/users 
domain.tld/contacts 
etc. 

例維特新郎PARAM(DE爲examle)

domain.tld/de 
domain.tld/de/users 
domain.tld/de/contacts 
etc. 

這是我的路由配置:

'router' => [ 
    'routes' => [ 
     'site' => [ 
      'type' => Segment::class, 
      'options' => [ 
       'route' => '[/:lang]', 
       'constraints' => [ 
        'lang' => '[a-z]{2}', 
       ], 
       'defaults' => [ 
        'controller' => Controller\IndexController::class, 
        'action' => 'index', 
        'lang' => 'en', 
       ], 
      ], 
      'may_terminate' => true, 
      'child_routes' => [ 
       'home' => [ 
        'type' => Literal::class, 
        'options' => [ 
         'route' => '/', 
         'defaults' => [ 
          'controller' => Controller\IndexController::class, 
          'action' => 'index', 
         ], 
        ], 
        'may_terminate' => true, 
       ], 
       'application' => [ 
        'type' => Segment::class, 
        'options' => [ 
         'route' => '/application[/:action]', 
         'defaults' => [ 
          'controller' => Controller\IndexController::class, 
          'action' => 'index', 
         ], 
        ], 
        'may_terminate' => true, 
       ], 
      ], 
     ], 
    ], 
] 

當我在URL一切郎參數是罰款。但是,當我嘗試打開「默認」郎而沒有指定它的路徑(例如.tld /應用程序/測試)它給我404錯誤。

我發現從段類轉換後的最終正則表達式是(\G(?:/(?P<param1>([a-z]{2})))?),路徑是/application/test。當preg_match上Segment.php執行:385將其與下面的值返回匹配:

​​

這顯然是錯誤的行爲。我的語言設置爲「廣告」,而不是打開應用程序/測試操作。我測試了10多個正則表達式,但沒有成功......(例如:^[a-z]{2}$)。

我做錯了什麼?

回答

0

您得到404,因爲URL不匹配site路由,因此跳過site的子路由。
試試這個:

 'home' => [ 
      'type' => Segment::class, 
      'options' => [ 
       'route' => '/[:lang/]', 
       'constraints' => [ 
        'lang' => '(en|de)?', 
       ], 
       'defaults' => [ 
        'controller' => Controller\IndexController::class, 
        'action' => 'index', 
        'lang' => 'en', 
       ], 
      ], 
      'may_terminate' => true, 
      'child_routes' => [ 
       'application' => [ 
        'type' => Segment::class, 
        'options' => [ 
         'route' => 'application[/:action]', 
         'defaults' => [ 
          'controller' => Controller\IndexController::class, 
          'action' => 'index', 
         ], 
        ], 
       ], 
      ], 
     ] 

如果不提供郎PARAM則需要默認(en在我的例子)參數。
實施例:

將example.tld /應用/測試

  • langen
  • controllerIndexController
  • actiontesttestAction()

示例。TLD /德/應用/測試

  • langde
  • controllerIndexController
  • actiontesttestAction()
+0

謝謝你的答案。它的工作原理是這樣的,但我的問題是,我在數據庫中添加了語言,因此它們是動態創建的,無法在約束數組中進行硬編碼。所以我需要匹配excactly 2個字符或無(默認)。也許正則表達式是錯誤的?我試圖匹配像''a-z] {2} |^$'這樣的空字符串,但也沒有工作。我希望你明白我的需要是什麼? – Botman

+1

你是在說'constraints'=> ['lang'=>'(en | de)?']'?你可以把'(en | de)?'改成'[a-z] {2}',它就可以工作。我檢查了乾淨的Zend Skeleton項目。 – SzymonM

+0

是的,我發現有什麼問題。我的孩子的路線已經預先加了斜線,並且不可能將路線與它匹配。一切都很好,但這是一種在兒童路線中使用斜線而不是父母的方式。 '[/:朗]'?我需要這樣做,因爲我的應用程序可以在子域語言風格或路徑風格之間進行選擇,因此我可以選擇上面所示的基本路線或'type'=> Hostname :: class, 'options'=> [ 'route'=> '[:lang。] framework.dev', ],',但我不能在主機名rotue內使用斜槓,如果我沒有在子路由中設置斜槓,它將制動主機名路由。 – Botman