Маршрутизация (Route) Laravel 5.*
Обработчик URL. Первый параметр URL, второй функция или ссылка на функцию контроллера (UserController@showProfile) которая запускается при соответствии запроса.
Route::get('foo', function () {
return 'Hello World';
});
Все маршруты расположены в файлах:
- routes/web.php — определены маршруты для web-интерфейса с проверкой состояния сессии (авторизации) и CSRF-защита
- routes/api.php — определены маршруты для api без проверки сессии
Маршруты по видам 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 запросы:
Route::any('foo', function () {
//
});
Маршрут с указанием видов запросов в массиве:
Route::match(['get', 'post'], '/', function () {
//
});
Все HTML-формы, ведущие к маршрутам POST, PUT или DELETE, которые определены в файле маршрутов web, должны иметь поле CSRF-токена. Иначе запрос будет отклонён.
Пример вставки в шаблоне в форму CSRF-токена (Blade Template Syntax):
<form method="POST" action="/profile">
{{ csrf_field() }}
...
</form>
Вставка CSRF-токена в PHP
<form method="POST" action="/profile">
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
...
</form>
Передавать параметры в маршрутах
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;
});
Регулярные выражения
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]+']);
Регулярные выражения для переменных в маршрутах. Применяется ко всем маршрутам. Задаются в методе boot() объекта RouteServiceProvider:
/**
* Определение привязок вашей модели, шаблонов фильтрации и т.д.
*
* @return void
*/
public function boot()
{
Route::pattern('id', '[0-9]+');
parent::boot();
}
/**
* Определение привязок вашей модели, шаблонов фильтрации и т.д.
*
* @param \Illuminate\Routing\Router $router
* @return void
*/
public function boot(Router $router)
{
$router->pattern('id', '[0-9]+');
parent::boot($router);
}
Получить объект текущего запроса можно через фасад Request или указав тип Illuminate\Http\Request, в котором внедрены зависимости:
use Illuminate\Http\Request;
Route::get('user/{id}', function(Request $request, $id)
{
if ($request->route('id'))
{
//
}
});
Задать имя маршрута
Route::get('user/profile', function () {
//
})->name('profile');
задать имя маршрута с помощью ключа массива as:
Route::get('user/profile', ['as' => 'profile', function () {
//
}]);
указать имена маршрутов для действий контроллера:
Route::get('user/profile', 'UserController@showProfile')->name('profile');
Route::get('user/profile', [
'as' => 'profile', 'uses' => 'UserController@showProfile'
]);
Группы маршрутов и именованные маршруты
Route::group(['as' => 'admin::'], function () {
Route::get('dashboard', ['as' => 'dashboard', function () {
// Маршрут назван "admin::dashboard"
}]);
});
имя маршрута, обрабатывающего текущий запрос:
$name = Route::currentRouteName();
Генерирование URL адресов для именованных маршрутов
// Генерирование URL...
$url = route('profile');
// Генерирование переадресаций...
return redirect()->route('profile');
Если у именованного маршрута есть параметры, можно передать их вторым аргументом метода route(). Эти параметры будут автоматически вставлены в соответствующие места URL:
Route::get('user/{id}/profile', function ($id) {
//
})->name('profile');
$url = route('profile', ['id' => 1]);
Маршруты для авторизованных (Использует посредника Auth)
Route::group(['middleware' => 'auth'], function () {
Route::get('/', function () {
// Использует посредника Auth
});
Route::get('user/profile', function () {
// Использует посредника Auth
});
});
Доменная маршрутизация
Route::group(['domain' => '{account}.myapp.com'], function () {
Route::get('user/{id}', function ($account, $id) {
//
});
});
Префиксы маршрута
Route::group(['prefix' => 'admin'], function () {
Route::get('users', function () {
// Соответствует URL "/admin/users"
});
});
prefix для передачи общих параметров
Route::group(['prefix' => 'accounts/{account_id}'], function () {
Route::get('detail', function ($accountId) {
// Соответствует URL "accounts/{account_id}/detail"
});
});
определить ограничения для именованного параметра в префиксе:
Route::group([
'prefix' => 'accounts/{account_id}',
'where' => ['account_id' => '[0-9]+'],
], function() {
// Здесь определение маршрутов
});
Привязка модели
Например, вместо внедрения ID пользователя можно внедрить весь экземпляр модели User, который соответствует данному ID.
Route::get('api/users/{user}', function (App\User $user) {
return $user->email;
});
Явная привязка
определить явные привязки модели в методе boot() класса RouteServiceProvider:
public function boot()
{
parent::boot();
Route::model('user', App\User::class);
}
// или
public function boot(Router $router)
{
parent::boot($router);
$router->model('user', 'App\User');
}
Затем определите маршрут, содержащий параметр {user}:
Route::get('profile/{user}', function (App\User $user) {
//
});
Получение текущего маршрута
$route = Route::current();
$name = Route::currentRouteName();
$action = Route::currentRouteAction();