Параметры роутов
Можно сделать так, чтобы Laravel сам разбивал URI так, чтобы его отдельные части попадали в заданные переменные. Для этого предназначены параметры
маршрутов. Давайте посмотрим на примере. Пусть у нас есть адреса вида /post/1
, где вместо единицы может быть любое число. Давайте напишем соответствующий маршрут, объявив вторую его часть параметром. Для этого придумаем имя параметра и возьмем его в фигурные скобки, вот так:
resources/routes/web.php<?php
Route::get('/post/{id}', function () {
return '';
});
После этого в параметр функции мы можем написать переменную, в которую будет попадать значение нашего параметра:
resources/routes/web.php<?php
Route::get('/post/{id}', function ($id) {
return 'пост ' . $id;
});
Несколько параметров
В маршрутах можно указывать несколько параметров:
resources/routes/web.php<?php
Route::get('/post/{catId}/{postId}', function ($catId, $postId) {
return $catId . ' ' . $postId;
});
Необязательные параметры
Сделаем так, чтобы номер страницы был необязательным параметром. Для этого после его имени поставим знак вопроса, при этом необязательный параметр должен иметь значение по умолчанию, иначе Laravel выдаст ошибку:
resources/routes/web.php<?php
Route::get('/posts/page/{page?}', function ($page = 1) {
return 'страница номер ' . $page;
});
Ограничения параметров
Давайте наложим ограничение на наш параметр. Это делается с помощью метода where
и регулярных выражений:
resources/routes/web.php<?php
Route::get('/post/{id}', function ($id) {
return 'пост ' . $id;
})->where('id', '[0-9]+');
Ограничения можно накладывать на несколько параметров. Для этого нужно вызвать несколько методов where
в виде цепочки:
resources/routes/web.php<?php
Route::get('/post/{slug}/{id}', function ($slug, $id) {
return 'пост ' . $slug . ' ' . $id;
})->where('slug', '[a-z0-9_-]+')->where('id', '[0-9]+');
Не очень удобно каждый раз для ограничения параметров прописывать одни и те же регулярки. Поэтому для популярных ограничений в Laravel созданы специальные методы.
Только цифры:
resources/routes/web.php<?php
Route::get('/post/{id}', function ($id) {
//
})->whereNumber('id');
Только буквы:
resources/routes/web.php<?php
Route::get('/post/{slug}', function ($slug) {
//
})->whereAlpha('slug');
Только буквы и цифры:
resources/routes/web.php<?php
Route::get('/post/{slug}', function ($slug) {
//
})->whereAlphaNumeric('slug');
Глобальные ограничения параметров
Можно сделать так, чтобы параметр с определенным именем всегда имел заданное ограничение в любых маршрутах. Это нужно прописовать в методе boot
класса RouteServiceProvider
.
App\Providers\RouteServiceProvider.php<?php
public function boot()
{
Route::pattern('id', '[0-9]+');
}
Теперь любой маршрут, у которого есть параметр id
, выполнится только если id
будет числом:
resources/routes/web.php<?php
Route::get('/post/{id}', function ($id) {
return '!!!'; // только если число
});