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

时间:2016-05-02 11:57:40

标签: php zend-framework zend-framework2

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'...)

重定向或生成网址

有没有其他优雅的解决方案,或者这根本不可能?

2 个答案:

答案 0 :(得分:0)

我总是告诉别人他们不应该将这种正则表达式用于控制器/动作。尝试使用更受限制的内容,例如(编辑|删除),并继续将列入白名单的操作添加到列表中。

答案 1 :(得分:0)

您可以随时执行类似

的操作
route => /foo[/:bar[/:baz[/:bing]]]

其中barbazbing将是动作,子控制器和子动作,并使用您刚才所做的约束来定义它们。然后,我会使用SupervisorController将此路线映射到superviseAction

然后,此操作将检查是否存在与给定路由名匹配的控制器,以及此控制器是否具有给定操作。然后你可以获取控制器并简单地调用动作。

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

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