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个特定的子部分。但在这种情况下,我必须使用->toRoute('parent/default'...)
有没有其他优雅的解决方案,或者这根本不可能?
答案 0 :(得分:0)
我总是告诉别人他们不应该将这种正则表达式用于控制器/动作。尝试使用更受限制的内容,例如(编辑|删除),并继续将列入白名单的操作添加到列表中。
答案 1 :(得分:0)
您可以随时执行类似
的操作route => /foo[/:bar[/:baz[/:bing]]]
其中bar
,baz
,bing
将是动作,子控制器和子动作,并使用您刚才所做的约束来定义它们。然后,我会使用SupervisorController
将此路线映射到superviseAction
。
然后,此操作将检查是否存在与给定路由名匹配的控制器,以及此控制器是否具有给定操作。然后你可以获取控制器并简单地调用动作。
然而就像@ grizzm0所说,这是不洁净的。它很容易出错,在某些时候你可能甚至不知道在哪里发送了什么。我个人的偏好(以及我圈子中大多数人的偏好,据我所知他们的风格)只是花时间并手动配置所有路线。
这是一点点工作,是的,但你总是知道发生了什么。有时候,魔法越少越好!