2016-05-02 71 views
1

ZF2路由中是否可以使用通用父路由,匹配所有公共操作,但是使用自定義子路由和控制器覆蓋特定區域?如果孩子和父母匹配,ZF2使用子路由

我想要什麼:

/parent => matches parent controller 
/parent/edit => matches parent controller editAction 
/parent/childsection => matches child controller 
/parent/childsection/edit => matches child controller editAction 

我無法想出一個適合我的需要任意配置。按照配置,我認爲會工作 - 但ZF2路線終止於父母的路線因爲childsection也可能是一個行動。

'parent' => array(
    'type' => 'Segment', 
    'may_terminate' => true, 
    'options' => array(
     'route' => '/parent[[/:action][/:id]]', 
     'constraints' => array(
      'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 
      'id' => '[0-9]+', 
     ), 
     'defaults' => array(
      'controller' => 'Application\Controller\Parent', 
      'action' => 'index', 
     ), 
    ), 
    'child_routes' => array(
     'child' => array(
      'type' => 'Segment', 
      'options' => array(
       'route' => '/childsection/:action[/:id]', 
       'constraints' => array(
        'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 
        'id' => '[0-9]+', 
       ), 
       'defaults' => array(
        'controller' => 'Application\Controller\Child', 
       ), 
      ), 
     ), 
    ), 
), 

唯一有效的工作是一個最小的父母文字路由和2個子路由 - 1個子節的通用和1特定。但在這種情況下,我必須重定向或生成url使用->toRoute('parent/default'...)

是否有任何其他優雅的解決方案,或者這是不可能的?

回答

0

我總是告訴人們,他們不應該使用這樣的正則表達式來進行控制器/操作。嘗試使用更多的限制,如(編輯|刪除),並不斷添加列入白名單的行動到列表。

+0

你能解釋爲什麼你告訴人們這麼做嗎? 我喜歡這些表達式,因爲如果我想添加新的動作,可以節省很多打字時間。如果我添加一個以'... Action'結尾的公共方法,我希望它可以自動訪問而不必深入配置。 但是,感謝評論,這可能是我目前的做法的替代方案。 –

0

你總是可以做這樣的事情

route => /foo[/:bar[/:baz[/:bing]]] 

其中barbazbing將採取行動,兒童控制器和兒童的行動,並與約束定義它們像你只是做。然後,我會將此路線映射到SupervisorControllersuperviseAction

此操作將檢查是否存在與給定的routename相匹配的控制器,並且此控制器是否具有給定的操作。然後,您可以獲取控制器並簡單地調用該操作。

然而就像@ grizzm0所說的那樣,這是不潔的。這很容易出錯,並且在某些時候,你可能甚至不知道在哪裏發送了什麼。我個人的偏好(以及圍繞我的圈子的大多數人的偏好,就我所知他們的風格而言)將只需要花時間並手動配置所有路線。

這是一點點工作,是的,但你總是知道發生了什麼。有時候,更少的魔力更多!

+0

好吧,我不想通過另一個控制器路由所有內容,就像你說的那樣,容易出錯並且實際上不透明。而且URL變得更大,有3個額外的段,而不是1.在這種情況下,我喜歡我目前的實現(1個用於子控制器的子路由和1個用於所有其他父操作的子路由)。但我想我會嘗試grizzm0的建議 –