Условия, при котором URL будет доступен
В файле routes/web.php при указании URL, через метод where() можно указать условия, при котором URL будет доступен.
// в {id} могут быть только числа
Route::get('news/{id}', [NewsController::class, 'show'])->whereNumber('id');
Route::get('news/{id}', [NewsController::class, 'show'])->where('id', '\d+');
// в {id} могут быть только латинские буквы
Route::get('news/{id}', [NewsController::class, 'show'])->whereAlpha('id');
Route::get('news/{id}', [NewsController::class, 'show'])->where('id', '[a-z]+');
// в {id} могут быть только числа или латинские буквы
Route::get('news/{id}', [NewsController::class, 'show'])->whereAlphaNumeric('id');
Route::get('news/{id}', [NewsController::class, 'show'])->where('id', '[\da-z]+');
// одно из указанных значений, например «ru» или «en»
Route::get('{lang}/news', [NewsController::class, 'index'])->where('lang', 'ru|en');
Route::get('{lang}/news', [NewsController::class, 'index'])->whereIn('lang', ['ru', 'en']);
Регулярное выражение \d разрешает использовать только числа, а знак + означает, что числа могут быть указаны в любом количестве.
Условие по умолчанию
Чтобы, например, не указывать для каждого параметра {id} условие where(), в файле app/Providers/AppServiceProvider.php можно указать условие по умолчанию.
# app/Providers/AppServiceProvider.php
use Illuminate\Support\Facades\Route;
class AppServiceProvider extends ServiceProvider
{
public function boot():void
{
// в URL для параметра {id} можно указывать только числа
Route::pattern('id', '\d+');
}
}
В Laravel 10 и ниже данный код указывался в файле «RouteServiceProvider.php».
Не учитывать слеши
Допустим надо реализовать удобочитаемую ссылку для фильтра, например «/news/filter/category-clothes/sex-woman/». Для этого надо указать следующий параметр, но она будет работать не так, как ожидается:
Route::get('/news/filter/{params}', [NewsController::class, 'filter']);
Если открыть страницу «/news/filter/category-clothes/», то она откроется. Но если добавить ещё параметры, разделённые символом «/», то будет открываться 404.
Чтобы дать Laravel понять, что символы «/» входят в параметр «{params}», используется код ниже:
Route::get('/news/filter/{params}', [NewsController::class, 'filter'])->where('params', '.*');
Не обязательный параметр
Указать, что в Route() не обязательно должен быть параметр, можно через символ «?».
Route::get('/search/{category?}', [NewsController::class, 'search']);
Теперь на примере выше, поиск будет открываться как на странице «/search», так и на странице, например, «/search/php».
Поддержать автора
Все статьи создаются и поддерживаются одним человеком,
если вам нравится контент, вы можете поддержать автора сайта
