2014-08-01 4 views
0

Это маршрут будет работать нормально для URL, как http://localhost:8080/promos/130-unburdened.pdfLaravel маршрут необъяснимо неудачу

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 ограниченными двумя необязательными параметрами? Это ошибка в Laravel?

+0

У вас нет двух необязательных параметров, по крайней мере, не так, как вы это делаете? См. Http://stackoverflow.com/questions/22649764/laravel-routes-with-multiple-optional-parameters и http://stackoverflow.com/questions/22877725/pass-many-optional-parameters-to-route-in -laravel-4 – Ian

+0

Почему у вас нет двух или более дополнительных параметров? Шаблоны сдерживают их, поэтому Laravel *** не должен иметь никаких проблем. – iconoclast

+0

Я не пытаюсь обрабатывать произвольное количество неограниченных параметров, например, второй вопрос. И я не уверен, почему и как первый вопрос может иметь значение. – iconoclast

ответ

0

Потому что есть неоднозначность: на вашем первом маршруте этот URL-адрес 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 

В третьем URL, 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 будет расширение, поэтому вы должны просто проверить, если $extension пуст:

$realExtension = $extension ? $extension : $something; 

Я знаю, что это уродливый, но на самом деле у меня нет хорошего ответа, может быть, кто-то может дать реальный ответ.

+0

Но '$ foo' *** не может *** содержать 'B', потому что' Route :: pattern' сжимает его до 'A', поэтому '$ foo' должен быть NULL, а' $ bar' должен быть 'B' , В противном случае, в чем смысл шаблона? Поэтому я не вижу никакой двусмысленности.'/ test/B' должен соответствовать маршруту и ​​давать вам' [$ foo => NULL, $ bar => 'B'] ' – iconoclast

+0

Вы говорите, что необязательный маршрут нельзя сопоставить ***, если предыдущий дополнительный маршрут был не соответствует ***? Если бы это было так, я думаю, это может объяснить проблему, но это похоже на зияющую дыру в маршрутизации Laravel, которая не имеет никакого смысла. – iconoclast

Смежные вопросы