- Маршрутизация. Параметры маршрутов
- (англ. Routing) — процесс определения маршрута следования данных в сетях связи.
Маршруты могут задаваться административно (статические маршруты), либо вычисляться с помощью алгоритмов маршрутизации, базируясь на информации о топологии и состоянии сети, полученной с помощью протоколов маршрутизации (динамические маршруты).
Статическими маршрутами могут быть:
· маршруты, не изменяющиеся во времени;
· маршруты, изменяющиеся по расписанию;
Простейшая маршрутизация
Все маршруты (routes) определены в файле app/Http/routes.php, который автоматически загружается фреймворком. В Laravel простейшие маршруты принимают URI (путь) и функцию-замыкание, предоставляя очень простой и выразительный метод определения маршрутов:
+ 5.2
Route::get('foo', function () { return 'Hello World'; });
Файл маршрутов по умолчанию
Файл routes.php загружается провайдером RouteServiceProvider и автоматически включается в группу посредников web, что обеспечивает доступ к состоянию сессии и CSRF-защиту. Большинство маршрутов вашего приложения будут определены в этом файле.
Доступные методы маршрутизатора
Маршрутизатор позволяет регистрировать маршруты для любого HTTP-запроса:
Route::get($uri, $callback); Route::post($uri, $callback); Route::put($uri, $callback); Route::patch($uri, $callback); Route::delete($uri, $callback); Route::options($uri, $callback);
Иногда необходимо зарегистрировать маршрут, который отвечает на HTTP-запросы нескольких типов. Это можно сделать методом match
()
. Или вы можете зарегистрировать маршрут, отвечающий на HTTP-запросы всех типов, с помощью метода any
()
:
Route::match(['get', 'post'], '/', function () { // }); Route::any('foo', function () { // });
+ 5.1 5.0
Route::get('/', function () { return 'Hello World'; }); Route::post('foo/bar', function () { return 'Hello World'; }); Route::put('foo/bar', function () { // }); Route::delete('foo/bar', function () { // });
Регистрация маршрута для нескольких типов запросов
Иногда необходимо зарегистрировать маршрут, который отвечает на HTTP-запросы нескольких типов. Это можно сделать методом match
()
фасада Route:
Route::match(['get', 'post'], '/', function () { return 'Hello World'; });
Или вы можете зарегистрировать маршрут, отвечающий на HTTP-запросы всех типов, с помощью метода any
()
:
Route::any('foo', function () { return 'Hello World'; });
Генерирование адресов URL для маршрутов
Вы можете генерировать URL для маршрутов вашего приложения методом url
()
:
$url = url('foo');
Параметры маршрутов
Обязательные параметры
Разумеется, иногда вам может понадобиться захватить сегменты URI в вашем маршруте. Например, если вам необходимо захватить ID пользователя из URL. Это можно сделать, определив параметры маршрута:
Route::get('user/{id}', function ($id) { return 'User '.$id; });
Вы можете определить сколько угодно параметров:
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) { // });
Параметры маршрута всегда заключаются в фигурные скобки. Параметры будут переданы в замыкание вашего маршрута при выполнении маршрута.
Параметры маршрута не могут содержать символ -. Используйте вместо него подчёркивание _.
Необязательные параметры маршрута
Иногда необходимо указать параметр маршрута, но при этом сделать его наличие необязательным. Это можно сделать, поместив знак вопроса ? после названия параметра. Не забудьте задать значение по умолчанию для соответствующей переменной маршрута:
Route::get('user/{name?}', function ($name = null) { return $name; }); Route::get('user/{name?}', function ($name = 'John') { return $name; });
Ограничения регулярными выражениями
Вы можете ограничить формат параметров вашего маршрута с помощью метода where
()
на экземпляре маршрута. Метод where
()
принимает название параметра и регулярное выражение, определяющее ограничения для параметра:
Route::get('user/{name}', function ($name) { // }) ->where('name', '[A-Za-z]+'); Route::get('user/{id}', function ($id) { // }) ->where('id', '[0-9]+'); Route::get('user/{id}/{name}', function ($id, $name) { // }) ->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
Глобальные ограничения
Если вы хотите, чтобы параметр был всегда ограничен заданным регулярным выражением, то можете использовать метод pattern
()
. Вам следует определить эти шаблоны в методе boot
()
вашего RouteServiceProvider:
/** * Определение привязок вашей модели, шаблонов фильтрации и т.д. * * @param \Illuminate\Routing\Router $router * @return void */ public function boot(Router $router) { $router->pattern('id', '[0-9]+'); parent::boot($router); }
Когда шаблон определён, он автоматически применяется ко всем маршрутам, использующим этот параметр:
Route::get('user/{id}', function ($id) { // Вызывается только если {id} числовой. });
Группы маршрутов
Группы маршрутов позволяют использовать общие атрибуты маршрутов, такие как посредники и пространства имён, для большого числа маршрутов без необходимости определять эти атрибуты для каждого отдельного маршрута. Общие атрибуты указываются в виде массива первым аргументом метода Route
::
group
()
.