Laravel路线莫名其妙地失败了

时间:2014-08-01 23:12:39

标签: php laravel

路由适用于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中的一个错误吗?

1 个答案:

答案 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

我知道这很难看,但我没有一个好的答案,也许有人可以提供真正的答案。