如果孩子和父母匹配,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'...)
是否有任何其他优雅的解决方案,或者这是不可能的?
我总是告诉人们,他们不应该使用这样的正则表达式来进行控制器/操作。尝试使用更多的限制,如(编辑|删除),并不断添加列入白名单的行动到列表。
你总是可以做这样的事情
route => /foo[/:bar[/:baz[/:bing]]]
其中bar
,baz
,bing
将采取行动,儿童控制器和儿童的行动,并与约束定义它们像你只是做。然后,我会将此路线映射到SupervisorController
与superviseAction
。
此操作将检查是否存在与给定的routename相匹配的控制器,并且此控制器是否具有给定的操作。然后,您可以获取控制器并简单地调用该操作。
然而就像@ grizzm0所说的那样,这是不洁的。这很容易出错,并且在某些时候,你可能甚至不知道在哪里发送了什么。我个人的偏好(以及围绕我的圈子的大多数人的偏好,就我所知他们的风格而言)将只需要花时间并手动配置所有路线。
这是一点点工作,是的,但你总是知道发生了什么。有时候,更少的魔力更多!
好吧,我不想通过另一个控制器路由所有内容,就像你说的那样,容易出错并且实际上不透明。而且URL变得更大,有3个额外的段,而不是1.在这种情况下,我喜欢我目前的实现(1个用于子控制器的子路由和1个用于所有其他父操作的子路由)。但我想我会尝试grizzm0的建议 –
你能解释为什么你告诉人们这么做吗? 我喜欢这些表达式,因为如果我想添加新的动作,可以节省很多打字时间。如果我添加一个以'... Action'结尾的公共方法,我希望它可以自动访问而不必深入配置。 但是,感谢评论,这可能是我目前的做法的替代方案。 –