此 路由适用于http://localhost:8080/promos/130-unburdened.pdf
等网址
Route::get('/{report_slug}/{report_code}{burdening_tag?}{extension?}', function($report_slug, $report_code, $burdening_tag='', $extension='') {
return "report_slug: ${report_slug}<br>report_code: ${report_code}<br>burdening_tag: $burdening_tag<br>extension: $extension";
});
但是 如果我在{extension?}
之前添加另一个可选参数,这是我真正需要的,它将失败,无论如何:
Route::get('/{report_slug}/{report_code}{burdening_tag?}{something?}{extension?}', function($report_slug, $report_code, $burdening_tag='', $something='', $extension='') {
return "report_slug: ${report_slug}<br>report_code: ${report_code}<br>burdening_tag: $burdening_tag<br>extension: $extension";
});
所有可选参数都定义了模式,因此它们无法匹配错误的内容:
Route::pattern('report_code', '[0-9]+');
Route::pattern('burdening_tag', '(-burdened|-unburdened)');
Route::pattern('something', 'X');
Route::pattern('extension', '(\.pdf|\.xlsx|\.xls|\.csv)');
Route::pattern('report_slug',
'(adplan|adplan-update|adplan-proof'
.'|scandown'
.'|promos|promo-updates'
.'|promos-finance|promos-cost-proof'
.'|retail-price-proof'
.'|finance'
.'|dsd-promos|managed-dsd-promos'
.'|anchor-group)'
);
然而一个人工作,另一个人崩溃并烧伤。怎么了? Laravel是否仅限于2个可选参数?这是Laravel中的一个错误吗?
答案 0 :(得分:0)
因为在您的第一个路线中存在歧义:此网址http://localhost:8080/promos/130.pdf
即使与模式匹配也不应该有效。
让我用一个简单的例子来解释:
Route::pattern('foo', 'A');
Route::pattern('bar', 'B');
Route::get('/test/{foo?}{bar?}',function($foo='',$bar=''){
return "foo: $foo <br> bar: $bar";
});
// http://localhost:8080/test/AB => work
// http://localhost:8080/test/A => work
// http://localhost:8080/test/B => doesn't work
在第三个网址中,foo
参数不为空但包含字母B
(在这种情况下bar
为空),因此它与“foo模式”不匹配,因此NotFoundHttpException
我在您的情况下尝试的内容(如果指定something
参数,则可以正常工作)
Route::pattern('something', 'X?');
// other patterns
Route::get('/{report_slug}/{report_code}{burdening_tag?}{something?}{extension?}', function($report_slug, $report_code, $burdening_tag='', $something='', $extension= '') {
return "report_slug: ${report_slug}<br>report_code: ${report_code}<br>burdening_tag: $burdening_tag <br>something: $something <br>extension: $extension ";
});
但如果未指定something
参数(如第三个示例中所示),则$extension
将为空,$something
将成为扩展名,因此您只需检查是否{{ 1}}为空:
$extension
我知道这很难看,但我没有一个好的答案,也许有人可以提供真正的答案。