Условия, при котором 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».