我在路由中的可选约束中遇到问题,该约束在其子路由中是非可选的。我的路由结构如下:
'profile' => [
'type' => 'segment',
'options' => [
'route' => '/profile[/:id]',
'constraints' => ['id' => '[0-9]*'],
'defaults' => [
'controller' => 'UserControllerUser',
'action' => 'profile'
]
],
'may_terminate' => true,
'child_routes' => [
'sessions' => [
'type' => 'literal',
'options' => [
'route' => '/sessions',
'defaults' => ['action' => 'sessions']
]
]
]
]
在我看来,这应该给我以下路线:
-
/profile
- 作品 -
/profile/123
- 作品 -
/profile/sessions
- 不起作用 -
/profile/123/sessions
- 作品
当我在 URL 视图帮助程序中使用路由 3 时,出现以下错误:
$this->url('profile/sessions');
ZendMvcRouterExceptionInvalidArgumentException
:缺少参数"id"
我最初将[0-9]+
作为我的约束,但将其设为可选(*
)似乎没有帮助。以前有没有人经历过这种情况?
将其添加到父路由。
'profile' => [
'type' => 'segment',
'options' => [ // ↓
'route' => '/profile[/:id][/:action]',
'constraints' => [ 'id' => '[0-9]*', 'action' => '[a-zA-Z][a-zA-Z0-9_-]*' ],
'defaults' => [
'controller' => 'UserControllerUser',
'action' => 'profile',
],
],
]
这将使具有id
和/或action
成为可选。至少从理论上讲,它应该使您列出的所有路线成为可能,这存在一些问题。
我曾经遇到过同样的问题,我发现的唯一解决方案是创建一个单独的路由(在您的情况下为/profile/sessions)作为基本路由的可选参数,在访问子路由时似乎成为强制性的。