如果孩子和父母匹配,ZF2使用子路由

问题描述:

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

你能解释为什么你告诉人们这么做吗? 我喜欢这些表达式,因为如果我想添加新的动作,可以节省很多打字时间。如果我添加一个以'... Action'结尾的公共方法,我希望它可以自动访问而不必深入配置。 但是,感谢评论,这可能是我目前的做法的替代方案。 –

你总是可以做这样的事情

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

其中barbazbing将采取行动,儿童控制器和儿童的行动,并与约束定义它们像你只是做。然后,我会将此路线映射到SupervisorControllersuperviseAction

此操作将检查是否存在与给定的routename相匹配的控制器,并且此控制器是否具有给定的操作。然后,您可以获取控制器并简单地调用该操作。

然而就像@ grizzm0所说的那样,这是不洁的。这很容易出错,并且在某些时候,你可能甚至不知道在哪里发送了什么。我个人的偏好(以及围绕我的圈子的大多数人的偏好,就我所知他们的风格而言)将只需要花时间并手动配置所有路线。

这是一点点工作,是的,但你总是知道发生了什么。有时候,更少的魔力更多!

+0

好吧,我不想通过另一个控制器路由所有内容,就像你说的那样,容易出错并且实际上不透明。而且URL变得更大,有3个额外的段,而不是1.在这种情况下,我喜欢我目前的实现(1个用于子控制器的子路由和1个用于所有其他父操作的子路由)。但我想我会尝试grizzm0的建议 –