用同样的PARAMS ZF2视图助手URL子路径(Zf2 view helper URL child

2019-10-21 00:52发布

我不能创建一个使用URL视图助手时,父母和孩子的路线有共同/相同PARAMS适当的URL。

我的网址配置:

'contact' => array(
    'type' => 'Segment',
    'options' => array(
        'route' => '/contact[/:contact][/action/:action]',
        'constraints' => array(
            'contact' => '[0-9]+',
            'action'  => '[a-zA-Z_-]+',
        ),
        'defaults' => array(
            'controller' => 'CrmContact',
            'action'     => 'index',
        ),
    ),
    'may_terminate' => true,
    'child_routes' => array(
        'task' => array(
            'type' => 'Segment',
            'options' => array(
                'route' => '/task[/:task][/action/:action]',
                'constraints' => array(
                    'task' => '[0-9]+',
                    'action'  => '[a-zA-Z_-]+',
                ),
                'defaults' => array(
                    'controller' => 'CrmTask',
                    'action'     => 'index',
                ),
            ),
        ),
    )
)

因为很明显双方父母和孩子的路线包含参数“动作”的时候,当你击中“/联系人/ 1 /任务/ 1 /动作/编辑”浏览器都是神直接意味着所谓的这条路线工作完全正常。 尝试使用视图助手网址构建此网址时出现的问题

$this->url('contact/task', array('contact' => $contact->id,'task' => $task->id, 'action' => 'edit'))

这会产生错误的URL虽然,即

/contact/1/action/edit/task/1    instead of 
/contact/1/task/1/action/edit

助手基本上劫持从孩子的路线行动PARAM并使用它的父路由...我不能停止使用帕拉姆“动作”,因为它是跨路由控制器方法要求的框架方式的一部分....

Answer 1:

您的路线接触和您的孩子的路线任务与不同的控制器相关联。 所以,你可以像这样把它们分开。

 'contact' => array(
    'type' => 'Segment',
    'options' => array(
        'route' => '/contact[/:contact][/action/:action]',
        'constraints' => array(
            'contact' => '[0-9]+',
            'action' => '[a-zA-Z_-]+',
        ),
        'defaults' => array(
            'controller' => 'crm-contact',
            'action' => 'index',
        ),
    ),
),
'task' => array(
    'type' => 'Segment',
    'options' => array(
        'route' => '/task[/:task][/action/:action]',
        'constraints' => array(
            'task' => '[0-9]+',
            'action' => '[a-zA-Z_-]+',
        ),
        'defaults' => array(
            'controller' => 'crm-task',
            'action' => 'index',
        ),
    ),
),

另外,缺省路由控制器/行动。 因此,独立的控制器通常是在不同的路线。 如果您需要在您的联系人ID在你的任务路线,你可以改变路线
'route' => 'contact/:contact/task[/:task][/action/:action]',也可以重命名任务和接触约束TASK_ID和CONTACT_ID为了清楚起见。



Answer 2:

我想保持“任务”为“接触”孩子航线的原因是因为任务仅在接触是有道理的,它基本上是一个多到一的关系。 我解决了它在更多的子路由打破它:

'contact' => array(
    'type' => 'Segment',
    'options' => array(
        'route' => '/contact[/:contact]',
        'constraints' => array(
            'contact' => '[0-9]+',
        ),
        'defaults' => array(
            'controller' => 'CrmContact',
            'action'     => 'index',
        ),
    ),
    'may_terminate' => true,
    'child_routes' => array(
        'contact_action' => array(
            'type' => 'Segment',
            'options' => array(
                'route' => '/action/:action',
                'constraints' => array(
                    'contact' => '[0-9]+',
                    'action'  => '[a-zA-Z_-]+',
                ),
                'defaults' => array(
                    'controller' => 'CrmContact',
                    'action'     => 'index',
                ),
            ),
        ),
        'task' => array(
            'type' => 'Segment',
            'options' => array(
                'route' => '/task[/:task]/action/:action',
                'constraints' => array(
                    'task' => '[0-9]+',
                    'action'  => '[a-zA-Z_-]+',
                ),
                'defaults' => array(
                    'controller' => 'CrmTask',
                    'action'     => 'index',
                ),
            ),
        ),
    )
),


文章来源: Zf2 view helper URL child route with same params