Базовая маршрутизация
Самые основные маршруты Laravel принимают URI и a Closure
, обеспечивая очень простой и выразительный метод определения маршрутов:
Route::get('foo', function () {
return 'Hello World';
});
Файлы маршрутов по умолчанию
Все маршруты Laravel определены в ваших файлах маршрутов, которые находятся в routes
каталоге. Эти файлы автоматически загружаются фреймворком. Файл определяет маршруты, которые для вашего веб - интерфейса. Этим маршрутам назначается группа промежуточного программного обеспечения, которая обеспечивает такие функции, как состояние сеанса и защита CSRF. Маршруты в нем не имеют состояния и назначаются группе промежуточного программного обеспечения.routes/web.php
web
routes/api.php
api
Для большинства приложений вы начнете с определения маршрутов в вашем файле. Доступ к маршрутам, указанным в, можно получить, введя URL-адрес определенного маршрута в браузере. Например, вы можете получить доступ к следующему маршруту, перейдя в браузере:routes/web.php
routes/web.php
http://your-app.test/user
Route::get('/user', 'UserController@index');
Маршруты, определенные в файле, вложены в группу маршрутов с помощью . В этой группе префикс URI применяется автоматически, поэтому вам не нужно вручную применять его к каждому маршруту в файле. Вы можете изменить префикс и другие параметры группы маршрутов, изменив свой класс.routes/api.php
RouteServiceProvider
/api
RouteServiceProvider
Доступные методы маршрутизатора
Маршрутизатор позволяет регистрировать маршруты, которые отвечают на любой 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('/', function () {
//
});
CSRF Защита
Любые формы HTML , указывающие POST
, PUT
или DELETE
маршруты, которые определены в web
файле маршруты должны включать маркер поле CSRF. В противном случае запрос будет отклонен. Вы можете прочитать больше о защите CSRF в документации CSRF :
<form method="POST" action="/profile">
@csrf
...
</form>
Перенаправить маршруты
Если вы определяете маршрут, который перенаправляет на другой URI, вы можете использовать метод. Этот метод предоставляет удобный ярлык, так что вам не нужно определять полный маршрут или контроллер для выполнения простого перенаправления:Route::redirect
Route::redirect('/here', '/there');
По умолчанию возвращает код состояния. Вы можете настроить код состояния, используя необязательный третий параметр:Route::redirect
302
Route::redirect('/here', '/there', 301);
Вы можете использовать метод для возврата кода состояния:Route::permanentRedirect
301
Route::permanentRedirect('/here', '/there');
Посмотреть маршруты
Если вашему маршруту нужно только вернуть вид, вы можете использовать этот метод. Как и метод, этот метод предоставляет простой ярлык, так что вам не нужно определять полный маршрут или контроллер. Метод принимает URI в качестве первого аргумента и имени представления в качестве второго аргумента. Кроме того, вы можете предоставить массив данных для передачи в представление в качестве необязательного третьего аргумента:Route::view
redirect
view
Route::view('/welcome', 'welcome');
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);
Параметры маршрута
Обязательные параметры
Иногда вам нужно будет захватить сегменты URI в вашем маршруте. Например, вам может потребоваться захватить идентификатор пользователя из 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
:
/**
* Define your route model bindings, pattern filters, etc.
*
* @return void
*/
public function boot()
{
Route::pattern('id', '[0-9]+');
parent::boot();
}
Как только шаблон был определен, он автоматически применяется ко всем маршрутам с использованием этого имени параметра:
Route::get('user/{id}', function ($id) {
// Only executed if {id} is numeric...
});
Закодированные косые черты
Компонент маршрутизации Laravel допускает все символы, кроме /
. Вы должны явно разрешить /
быть частью вашего заполнителя, используя where
регулярное выражение условия:
Route::get('search/{search}', function ($search) {
return $search;
})->where('search', '.*');
Закодированные косые черты поддерживаются только в последнем сегменте маршрута.
Названные маршруты
Именованные маршруты позволяют удобно создавать URL-адреса или перенаправления для определенных маршрутов. Вы можете указать имя для маршрута, связав name
метод с определением маршрута:
Route::get('user/profile', function () {
//
})->name('profile');
Вы также можете указать имена маршрутов для действий контроллера:
Route::get('user/profile', 'UserProfileController@show')->name('profile');
Создание URL-адресов для именованных маршрутов
После того как вы присвоили имя данному маршруту, вы можете использовать имя маршрута при создании URL-адресов или перенаправлений с помощью глобальной route
функции:
// Generating URLs...
$url = route('profile');
// Generating Redirects...
return redirect()->route('profile');
Если указанный маршрут определяет параметры, вы можете передать параметры в качестве второго аргумента route
функции. Указанные параметры будут автоматически вставлены в URL в правильных позициях:
Route::get('user/{id}/profile', function ($id) {
//
})->name('profile');
$url = route('profile', ['id' => 1]);
Проверка текущего маршрута
Если вы хотите определить, был ли текущий запрос направлен на заданный именованный маршрут, вы можете использовать named
метод в экземпляре Route. Например, вы можете проверить текущее имя маршрута из промежуточного программного обеспечения маршрута:
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($request->route()->named('profile')) {
//
}
return $next($request);
}
Группы маршрутов
Группы маршрутов позволяют вам совместно использовать атрибуты маршрута, такие как промежуточное программное обеспечение или пространства имен, по большому количеству маршрутов без необходимости определять эти атрибуты на каждом отдельном маршруте. Общие атрибуты указываются в формате массива в качестве первого параметра метода.Route::group
Вложенные группы пытаются интеллектуально «объединить» атрибуты со своей родительской группой. Промежуточное программное обеспечение и where
условия объединяются, а имена, пространства имен и префиксы добавляются. Разделители пространства имен и косые черты в префиксах URI добавляются автоматически при необходимости.
Промежуточное
Чтобы назначить промежуточное программное обеспечение для всех маршрутов в группе, вы можете использовать middleware
метод до определения группы. Промежуточное программное обеспечение выполняется в том порядке, в котором они перечислены в массиве:
Route::middleware(['first', 'second'])->group(function () {
Route::get('/', function () {
// Uses first & second Middleware
});
Route::get('user/profile', function () {
// Uses first & second Middleware
});
});
Пространства имен
Другим распространенным вариантом использования групп маршрутов является назначение одного и того же пространства имен PHP группе контроллеров с помощью namespace
метода:
Route::namespace('Admin')->group(function () {
// Controllers Within The "App\Http\Controllers\Admin" Namespace
});
Помните, что по умолчанию RouteServiceProvider
файлы маршрутов включены в группу пространств имен, что позволяет регистрировать маршруты контроллера без указания полного префикса пространства имен. Таким образом, вам нужно только указать часть пространства имен, которая идет после базового пространства имен.App\Http\Controllers
App\Http\Controllers
Субдоменная маршрутизация
Группы маршрутов также могут использоваться для обработки маршрутизации в субдомене. Субдоменам могут быть назначены параметры маршрута точно так же, как и URI маршрута, что позволяет вам захватывать часть субдомена для использования в вашем маршруте или контроллере. Субдомен может быть указан путем вызова domain
метода перед определением группы:
Route::domain('{account}.myapp.com')->group(function () {
Route::get('user/{id}', function ($account, $id) {
//
});
});
Чтобы обеспечить доступность маршрутов вашего субдомена, вам необходимо зарегистрировать маршруты субдомена перед регистрацией маршрутов корневого домена. Это не позволит маршрутам корневого домена перезаписывать маршруты поддоменов, которые имеют одинаковый путь URI.
Префиксы маршрутов
Этот prefix
метод может использоваться для префикса каждого маршрута в группе с заданным URI. Например, вы можете захотеть поставить перед всеми URI маршрута в группе префикс admin
:
Route::prefix('admin')->group(function () {
Route::get('users', function () {
// Matches The "/admin/users" URL
});
});
Префиксы имени маршрута
Этот name
метод может использоваться для добавления к каждому имени маршрута в группе заданной строки. Например, вы можете захотеть поставить перед всеми именами сгруппированных маршрутов префикс admin
. Данная строка имеет префикс к имени маршрута в точности так, как он указан, поэтому мы будем обязательно указывать завершающий .
символ в префиксе:
Route::name('admin.')->group(function () {
Route::get('users', function () {
// Route assigned name "admin.users"...
})->name('users');
});
Привязка модели маршрута
При внедрении идентификатора модели в маршрут или действие контроллера вы часто будете запрашивать модель, соответствующую этому идентификатору. Привязка модели маршрута Laravel обеспечивает удобный способ автоматической вставки экземпляров модели непосредственно в ваши маршруты. Например, вместо введения идентификатора пользователя вы можете внедрить весь User
экземпляр модели, который соответствует данному идентификатору.
Неявное связывание
Laravel автоматически разрешает модели Eloquent, определенные в маршрутах или действиях контроллера, чьи имена переменных с подсказками типов соответствуют имени сегмента маршрута. Например:
Route::get('api/users/{user}', function (App\User $user) {
return $user->email;
});
Поскольку $user
переменная подсказана по типу в качестве модели Eloquent, а имя переменной соответствует сегменту URI, Laravel автоматически внедрит экземпляр модели, идентификатор которой соответствует соответствующему значению, из URI запроса. Если соответствующий экземпляр модели не найден в базе данных, автоматически генерируется HTTP-ответ 404.App\User
{user}
Настройка имени ключа
Если вы хотите, чтобы привязка модели использовала столбец базы данных, отличный от id
извлечения данного класса модели, вы можете переопределить getRouteKeyName
метод в модели Eloquent:
/**
* Get the route key for the model.
*
* @return string
*/
public function getRouteKeyName()
{
return 'slug';
}
Явная привязка
Чтобы зарегистрировать явную привязку, используйте метод маршрутизатора, model
чтобы указать класс для данного параметра. Вы должны определить свои явные привязки модели в boot
методе RouteServiceProvider
класса:
public function boot()
{
parent::boot();
Route::model('user', App\User::class);
}
Затем определите маршрут, который содержит параметр:{user}
Route::get('profile/{user}', function (App\User $user) {
//
});
Поскольку мы привязали все параметры к модели, экземпляр будет добавлен в маршрут. Так, например, запрос будет впрыскивать экземпляр из базы данных , которая имеет идентификатор .{user}
App\User
User
profile/1
User
1
Если соответствующий экземпляр модели не найден в базе данных, автоматически генерируется HTTP-ответ 404.
Настройка логики разрешения
Если вы хотите использовать свою собственную логику разрешения, вы можете использовать метод. Вы передаете метод получит значение сегмента URI и должен возвращать экземпляр класса , который должен быть введен в маршрут:Route::bind
Closure
bind
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
parent::boot();
Route::bind('user', function ($value) {
return App\User::where('name', $value)->first() ?? abort(404);
});
}
Кроме того, вы можете переопределить resolveRouteBinding
метод в вашей модели Eloquent. Этот метод получит значение сегмента URI и должен вернуть экземпляр класса, который должен быть введен в маршрут:
/**
* Retrieve the model for a bound value.
*
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function resolveRouteBinding($value)
{
return $this->where('name', $value)->first() ?? abort(404);
}
Запасные маршруты
Используя метод, вы можете определить маршрут, который будет выполняться, когда никакой другой маршрут не соответствует входящему запросу. Как правило, необработанные запросы автоматически отображают страницу «404» через обработчик исключений вашего приложения. Однако, поскольку вы можете определить маршрут в своем файле, все промежуточное программное обеспечение в группе промежуточного программного обеспечения будет применяться к маршруту. Вы можете добавить дополнительное промежуточное программное обеспечение для этого маршрута по мере необходимости:Route::fallback
fallback
routes/web.php
web
Route::fallback(function () {
//
});
Резервный маршрут всегда должен быть последним, зарегистрированным вашим приложением.
Ограничение скорости
Laravel включает промежуточное программное обеспечение для ограничения доступа к маршрутам в вашем приложении. Для начала назначьте throttle
промежуточное ПО для маршрута или группы маршрутов. throttle
Промежуточный слой принимает два параметра , которые определяют максимальное количество запросов , которые могут быть сделаны в заданном числе минут. Например, давайте уточним, что аутентифицированный пользователь может обращаться к следующей группе маршрутов 60 раз в минуту:
Route::middleware('auth:api', 'throttle:60,1')->group(function () {
Route::get('/user', function () {
//
});
});
Динамическое ограничение скорости
Вы можете указать максимум динамического запроса на основе атрибута аутентифицированной User
модели. Например, если ваша User
модель содержит rate_limit
атрибут, вы можете передать имя атрибута throttle
промежуточному программному обеспечению, чтобы оно использовалось для расчета максимального количества запросов:
Route::middleware('auth:api', 'throttle:rate_limit,1')->group(function () {
Route::get('/user', function () {
//
});
});
Форма Спуфинг
HTML форма не поддерживает PUT
, PATCH
или DELETE
действий. Таким образом, при определении PUT
, PATCH
или DELETE
маршрутов, которые вызываются из HTML - формы, вам нужно будет добавить скрытое _method
поле в форме. Значение, отправленное с _method
полем, будет использоваться в качестве метода HTTP-запроса:
<form action="/foo/bar" method="POST">
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>
Вы можете использовать @method
директиву Blade для генерации _method
ввода:
<form action="/foo/bar" method="POST">
@method('PUT')
@csrf
</form>
Доступ к текущему маршруту
Вы можете использовать current
, currentRouteName
и currentRouteAction
методы на Route
фасаде , чтобы получить доступ к информации об обработке входящего запроса маршрута:
$route = Route::current();
$name = Route::currentRouteName();
$action = Route::currentRouteAction();
Обратитесь к документации по API для обоих базового класса фасада маршрута и объекта маршрута , чтобы просмотреть все доступные методы.
0 комментариев