- Маршрутизация. Параметры маршрутов
- (англ. 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().
