0

使用 ZF3,我想访问如下 URL:

/dossier/add
/dossier/edit/2
/dossier/edit/2/droit/add
/dossier/edit/2/droit/edit/3
...

这是我的路由配置:

'dossier' => [
     'type' => Segment::class,
     'options' => [
         'route' => '/dossier[/][:action][/:dosid]',
         'constraints' => [
             'action' => '[a-zA-Z0-9_-]+',
             'dosid' => '[0-9_-]*|b[0-9]+|all'
         ],
         'defaults' => [
             'controller' => Controller\DossierController::class,
             'action'     => 'add',
         ],
     ],
     'may_terminate' => true,
     'child_routes' => [
         'droit' => [
             'type' => Segment::class,
             'options' => [
                 'route' => '/droit[/][:action][/:droid]',
                 'constraints' => [
                     'action' => '[a-zA-Z0-9_-]+',
                     'droid' => '[0-9_-]*|b[0-9]+|all'
                 ],
                 'defaults' => [
                     'controller' => Controller\DroitController::class,
                     'action'     => 'add',
                 ],
             ]
         ]
     ]
 ]

父路由和子路由都有一个“动作”参数。此配置在直接调用时工作正常(即在浏览器中输入 url “/dossier/edit/3/droit/delete/2”)。但是,使用 viewHelper Url 构建 URL:

$this->url('dossier/droit', ['action' => 'delete', 'dosid' => 3, 'droid' => 2]);

产生网址:

/dossier/delete/3/droit//2

在显示创建(“添加”)视图时,而不是 URL :

/dossier/edit/3/droit/delete/2

从 topic Zf2 view helper URL child route with same params,我知道我可以为每个子操作创建一个子路由,从而摆脱第二个“action”参数,但这似乎不太正确。

我不禁想知道为什么我能够同时拥有 Segment 类型的父子路由并且仍然被卡住,因为没有办法重命名“动作”参数而不破坏 ZF 将 URL 路由到控制器方法的方式。

路线“droit”必须是“档案”的子路线,因为它需要档案的 id(并且将档案的 id 放在表单中的隐藏输入中似乎是一个更糟糕的解决方案)。

我错过了什么吗?没有更好的解决方案吗?

4

0 回答 0