Я изменил параметр маршрута по умолчанию в Laravel 5.7 как
Route::resource('questions', 'QuestionController')->parameters(['questions' => 'question_slug']);
Но я сбит с толку, как я установил шаблон регулярного выражения для этого нового параметра, я хочу применить slug_regex к этому параметру, я пробовал это:
Route::resource('questions', 'QuestionController')->parameters(['questions' => 'question_slug'])->where(['slug' => '^[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*$']);
Но получаю эту ошибку:
BadMethodCallException Method Illuminate\Routing\PendingResourceRegistration::where does not exist.






Итак, Route - это не настоящий класс в Laravel, а на самом деле Фасад, который дает вам статический доступ к реальным классам.
Настоящий класс, к которому это дает вам доступ, - это Illuminate\Routing\Router. Если посмотреть на функцию resource() (это то, что вызывается при записи Route::resource()), мы видим, что она возвращает объект Illuminate\Routing\PendingResourceRegistration, а метод where() недоступен для этого класса.
Итак, как решить вашу проблему? Что ж, есть два способа: вы можете проверить, что slug действителен в ваших действиях controller, или вы можете создать middleware, поскольку к ресурсным маршрутам может быть подключен middleware.
Наконец, я нашел решение в одной строке кода, установить проверку регулярного выражения для параметра / параметров, просто перейдите к YourProjectName\app\Providers\RouteServiceProvider.php, где вы найдете метод с именем boot, он по умолчанию содержит этот код;
public function boot()
{
//
parent::boot();
}
Просто добавьте сюда свой параметр как;
Route::pattern('parameter', 'regex-rule-here');
Итак, ваш код будет таким:
public function boot()
{
//
Route::pattern('slug', '[\w\d\-\_]+');
parent::boot();
}
Для получения дополнительных параметров просто передайте свои параметры в массиве как:
Route::pattern(['1st-para' => 'regex-rule-here', '2nd-para' => 'regex-rule-here']);