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'
                        ]
                    ]
                ] 
            ] 
        ]
    ]
]