Laravel多个可选参数不起作用。

3

当使用以下带有2个可选参数的路由时,

Route::get('/abc-{abc_id?}/xyz-{xyz_id?}', function($abc_id=0, $xyz_id=0)
    {
        return "\n hello ... World";
    });

关于请求

/abc-1/xyz-15           - Hello World
/abc-1/xyz              - Hello World

But for

/abc-/xyz-15           - 404
/abc/xyz-15            - 404

为什么第一个可选参数无法正常工作?有其他解决方案吗?
请注意,两个参数都在URL中,而不是作为GET属性。

1
这里有一个关于同样问题的旧问题:https://dev59.com/63_aa4cB1Zd3GeqP56IT - Joel Hinz
请注意,两个参数都是在URL中而不是作为GET属性。 - Jithin Jose
1个回答

4

第一个可选参数之后的所有内容必须是可选的。如果路由中可选参数后的部分是必需的,则该参数变为必需。

在您的情况下,由于路由中 /xyz- 部分是必需的,并且它位于第一个可选参数之后,因此第一个可选参数变为必需。

您可以选择将id前缀作为参数的一部分,并使用模式匹配来强制执行路由格式。然后,您需要从参数值中解析出实际的id。

Route::get('/{abc_id?}/{xyz_id?}', function($abc_id = 0, $xyz_id = 0) {
    $abc_id = substr($abc_id, 4) ?: 0;
    $xyz_id = substr($xyz_id, 4) ?: 0;

    return "\n hello ... World";
})->where([
    'abc_id' => 'abc(-[^/]*)?',
    'xyz_id' => 'xyz(-[^/]*)?'
]);

这个解析路由跟预期一样,但也不知道为什么Laravel有这么奇怪的规定。 - Jithin Jose
1
@JithinJose 这实际上是Symfony的限制。Laravel的路由是建立在Symfony的路由之上的。在这种情况下,Laravel使用Symfony的RouteCompiler。根据Symfony文档此处所述:“当然,您可以有多个可选占位符(例如/blog/{slug}/{page}),但是可选占位符后面的所有内容都必须是可选的。例如,/{page}/blog是一个有效的路径,但是页面将始终是必需的(即仅使用/blog将无法匹配此路由)。 - patricus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接