Маршрутизация (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();