zf2 段路由在最后位置捕获 id
zf2 segment route catching id on last position
我希望我的 url 路线有一个动态部分并最终出现在同一页面上,不管我 URL.
的中间部分有什么内容
例如:
/en/the-old-category/the-old-name/pid/123123123
/en/the-new-category/now-in-a-sub-category/the-new-name/pid/123123123
两者都应该被同一个 controller/action 捕获(如有必要,它将发出相关的 301/302)。
我当前的路由器包含:
'router' => [
'routes' => [
'blog' => [
'type' => 'segment',
'options' => [
'route' => "/[:language]",
'constraints' => [
'language' => '[a-z]{2}'
],
'defaults' => [
'controller' => 'Blog\Controller\List',
'action' => 'index',
'language' => 'en'
],
'may_terminate' => true,
'child_routes' => [
'detail' => 'segment',
'options' => [
'route' => '/:path/pid/:postid',
'constraints' => [
'path' => '.+',
'postid' => '\d{1,10}'
],
'defaults' => [
'controller' => 'Blog\Controller\List',
'action' => 'detail'
]
]
]
]
]
]
]
但它不起作用。
/
和 /en
被正确捕获,但像我之前提出的那样的子路由没有被正确捕获。
我做我想做的事的方向正确吗?我应该改为编写正则表达式路由吗?
.+
不会匹配 /
,因为段路由在应用约束之前在 /
上拆分了路径。要使您的路线正常运行,您需要 /:path/:foo/pid/:postid
之类的东西。正则表达式路由也可能有效。
由于在我的 URL 的第一部分和最后一部分之间,我需要有可变数量的路段,我不能用 segment
路线做到这一点,但我能够使用 regex
路由管理它,配置如下:
'router' => [
'routes' => [
'blog' => [
'type' => 'regex',
'options' => [
'regex' => "/(?<language>[a-z]{2})?",
'spec' => "/%language%",
'defaults' => [
'controller' => 'Blog\Controller\List',
'action' => 'index'
],
'may_terminate' => true,
],
'child_routes' => [
'detail' => [
'type' => 'regex',
'options' => [
'regex' => '/(?<path>.+)/pid/(?<postid>\d+)$',
'spec' => '/%path%/pid/%postid%',
'defaults' => [
'controller' => 'Blog\Controller\List',
'action' => 'detail'
]
]
]
]
]
]
]
我希望我的 url 路线有一个动态部分并最终出现在同一页面上,不管我 URL.
的中间部分有什么内容例如:
/en/the-old-category/the-old-name/pid/123123123
/en/the-new-category/now-in-a-sub-category/the-new-name/pid/123123123
两者都应该被同一个 controller/action 捕获(如有必要,它将发出相关的 301/302)。
我当前的路由器包含:
'router' => [
'routes' => [
'blog' => [
'type' => 'segment',
'options' => [
'route' => "/[:language]",
'constraints' => [
'language' => '[a-z]{2}'
],
'defaults' => [
'controller' => 'Blog\Controller\List',
'action' => 'index',
'language' => 'en'
],
'may_terminate' => true,
'child_routes' => [
'detail' => 'segment',
'options' => [
'route' => '/:path/pid/:postid',
'constraints' => [
'path' => '.+',
'postid' => '\d{1,10}'
],
'defaults' => [
'controller' => 'Blog\Controller\List',
'action' => 'detail'
]
]
]
]
]
]
]
但它不起作用。
/
和 /en
被正确捕获,但像我之前提出的那样的子路由没有被正确捕获。
我做我想做的事的方向正确吗?我应该改为编写正则表达式路由吗?
.+
不会匹配 /
,因为段路由在应用约束之前在 /
上拆分了路径。要使您的路线正常运行,您需要 /:path/:foo/pid/:postid
之类的东西。正则表达式路由也可能有效。
由于在我的 URL 的第一部分和最后一部分之间,我需要有可变数量的路段,我不能用 segment
路线做到这一点,但我能够使用 regex
路由管理它,配置如下:
'router' => [
'routes' => [
'blog' => [
'type' => 'regex',
'options' => [
'regex' => "/(?<language>[a-z]{2})?",
'spec' => "/%language%",
'defaults' => [
'controller' => 'Blog\Controller\List',
'action' => 'index'
],
'may_terminate' => true,
],
'child_routes' => [
'detail' => [
'type' => 'regex',
'options' => [
'regex' => '/(?<path>.+)/pid/(?<postid>\d+)$',
'spec' => '/%path%/pid/%postid%',
'defaults' => [
'controller' => 'Blog\Controller\List',
'action' => 'detail'
]
]
]
]
]
]
]