Маршрутизация
Основы маршрутизации
Самые простые маршруты Laravel принимают URI и Closure
, обеспечивая очень простой и выразительный метод определения маршрутов:
Файлы маршрутов по умолчанию
Все маршруты Laravel определены в файлах, расположенных в каталоге routes
. Эти файлы автоматически загружаются фреймворком. Файл routes/web.php
определяет маршруты для веб-интерфейса. Эти маршруты относятся к группе посредников web
, которая предоставляет такие возможности, как состояние сеанса и защита от CSRF. Маршруты в routes/api.php
являются stateless (без состояния) и относятся к группе посредников api
.
Для большинства приложений вы начнете с определения маршрутов в файле routes/web.php
. Доступ к маршрутам, определенным в routes/web.php
, можно получить, введя URL определенного маршрута в браузер. Например, Вы можете получить доступ к следующему маршруту, перейдя по адресу http://your-app.test/user
:
Маршруты, определенные в файле routes/api.php
, вложены в группу маршрутов RouteServiceProvider
. Внутри этой группы автоматически применяется префикс URI /api
, поэтому нет необходимости вручную указывать его в каждом маршруте в этом файле. Изменить префикс и другие опции группы маршрутов можно, изменив класс RouteServiceProvider
.
Доступные методы маршрутизации
Маршрутизатор позволяет регистрировать маршруты для любого типа HTTP запроса:
Иногда вам может понадобиться зарегистрировать маршрут, который отвечает на несколько типов HTTP-запросов. Это можно сделать, используя метод match
. Или даже можно зарегистрировать маршрут, который отвечает на все типы HTTP-запросов, используя метод any
:
CSRF защита
Любые HTML формы, указывающие на маршруты POST
, PUT
, PATCH
или DELETE
, определенные в файле маршрутов web
, должны включать поле токена CSRF. В противном случае запрос будет отклонен. Подробнее о защите CSRF Вы можете прочитать в документации по CSRF защите:
Перенаправленные маршруты
Если вы определяете маршрут, который перенаправляет на другой URI, то можете использовать метод Route::redirect
. Этот метод является удобным ярлыком, так что вам не придется определять полный маршрут или контроллер для выполнения простого перенаправления:
По умолчанию Route::redirect
возвращает код состояния 302
. Код статуса можно настроить, используя дополнительный третий параметр:
Вы можете использовать метод Route::permanentRedirect
для возврата кода статуса 301
:
Маршруты с представлениями
Если маршрут должен только вернуть представление, вы можете использовать метод Route::view
. Как и redirect
, этот метод предоставляет простой ярлык, так что Вам не нужно определять полный маршрут или контроллер. Метод view
принимает URI в качестве первого аргумента, и имя представления — в качестве второго. Кроме того, вы можете предоставить массив данных для передачи в представление третьим необязательным аргументом:
Параметры маршрута
Обязательные параметры
Иногда нужно определить сегменты URI в пределах маршрута. Например, вам может понадобиться определить идентификатор пользователя из URL. Вы можете сделать это, определив параметры маршрута:
Вы можете определить столько параметров маршрута, сколько требуется:
Параметры маршрута всегда заключены в фигурные скобки {}
, должны состоять из буквенных знаков, и не могут содержать символ -
. Вместо символа -
используйте символ подчеркивания (_
). Параметры маршрута вставляются в функции обратного вызова/контроллеры маршрута в зависимости от их порядка — имена аргументов функции обратного вызова/контроллера не имеют значения.
Необязательные параметры
Иногда может понадобиться указать параметр маршрута, но сделать его присутствие необязательным. Вы можете сделать это, поставив символ ?
после имени параметра. Убедитесь, что соответствующая переменная маршрута имеет значение по умолчанию:
Ограничения регулярными выражениями
Вы можете ограничить формат параметров вашего маршрута, используя метод where
на экземпляре маршрута. Метод where
принимает имя параметра и регулярное выражение, определяющее, как параметр должен быть ограничен:
Глобальные ограничения
Если вы хотите, чтобы параметр маршрута всегда был ограничен заданным регулярным выражением, то можете использовать метод pattern
. Эти шаблоны следует определять в методе boot
вашего RouteServiceProvider
:
После определения шаблона он автоматически применяется ко всем маршрутам, использующим имя этого параметра:
Использоание прямого слэша
Компонент маршрутизации Laravel позволяет использовать все символы, кроме /
. Вы должны явно разрешить /
быть частью плейсхолдера, используя регулярное выражение условия where
:
Использование прямого слэша поддерживаются только в пределах последнего сегмента маршрута.
Именованные маршруты
Именованные маршруты позволяют удобно генерировать URL или перенаправлять для конкретных маршрутов. Вы можете задать имя, вызвав метод name
в определении маршрута:
Также можно указать имена маршрутов для действий контроллера:
Названия маршрутов всегда должны быть уникальными.
Генерация URL-адресов по имени маршрута
После того, как вы присвоили имя данному маршруту, можете использовать его для генерации URL-адресов или переадресации через глобальную функцию route
:
Если именованный маршрут определяет параметры, то можете передать параметры в качестве второго аргумента в функцию route
. Данные параметры будут автоматически вставлены в URL в правильном порядке:
Если вы передадите в массив дополнительные параметры, то эти пары ключ/значение будут автоматически добавлены в строку запроса сгенерированного URL:
Иногда нужно указать значения по умолчанию для URL-параметров в масштабе всего запроса, например, для текущей локали. Для этого можно использовать метод URL::defaults
.
Проверка текущего маршрута
Если вы хотите определить, был ли текущий запрос направлен на заданный именованный маршрут, то можете использовать метод named
на экземпляре Route. Например, вы можете проверить текущее название маршрута из посредника маршрута:
Группы маршрутов
Группы маршрутов позволяют совместно использовать атрибуты маршрута, такие как посредники или пространства имен, на большом количестве маршрутов без необходимости определения этих атрибутов на каждом отдельном маршруте. Общие атрибуты указываются в формате массива в качестве первого параметра метода Route::group
.
Вложенные группы пытаются умно "объединить" атрибуты со своей родительской группой. Посредники и условия where
объединяются, в то время как имена, пространства имен и префиксы добавляются. Разделители пространств имен и слэши в префиксах URI добавляются при необходимости автоматически.
Посредники
Для назначения посредника для всех маршрутов внутри группы, вы можете использовать метод middleware
перед определением группы. Посредники выполняются в том порядке, в котором они перечислены в массиве:
Пространства имен
Другим распространенным случаем использования групп маршрутов является назначение одного и того же пространства имён PHP группе контроллеров методом namespace
:
Помните, что по умолчанию RouteServiceProvider
включает файлы маршрутов в группу пространств имен, позволяя регистрировать маршруты контроллеров без указания полного префикса App\Http\Controllers
. Таким образом, вам нужно указать только ту часть пространства имен, которая идет после базового App\Http\Controllers
пространства имен.
Маршрутизация поддоменов
Группы маршрутов также могут использоваться для обработки субдоменной маршрутизации. Поддоменам могут быть назначены параметры маршрута, такие же как и URI маршрута, что позволяет вам захватить часть поддомена для использования в вашем маршруте или контроллере. Поддомен можно указать, вызвав метод domain
перед определением группы:
Для того чтобы убедиться, что ваши маршруты субдоменов доступны, необходимо зарегистрировать маршруты субдоменов до регистрации маршрутов корневых доменов. Это не позволит маршрутам корневого домена перезаписывать маршруты субдоменов, которые имеют один и тот же путь URI.
Префиксы маршрута
Метод prefix
может быть использован для префиксации каждого маршрута в группе с заданным URI. Например, вы можете добавить префикс admin
во все URI маршрута внутри группы:
Префикс имен маршрутов
Метод name
может использоваться для префиксации каждого имени маршрута в группе с заданной строкой. Например, Вы можете добавить префикс admin
во все имена сгруппированных маршрутов. Данная строка будет приклеена к названию маршрута в точности так, как она указано, поэтому мы обязательно обеспечим разделительный символ .
в префиксе:
Внедрение моделей в маршруты
При введении идентификатора модели в маршрут или действие контроллера, вы часто запрашиваете модель, соответствующую этому идентификатору. Привязка модели к маршруту обеспечивает удобный способ автоматического внедрения экземпляров модели непосредственно в маршруты. Например, вместо того, чтобы внедрить ID пользователя, вы можете ввести весь экземпляр модели User
, соответствующий данному ID.
Неявная привязка
Laravel автоматически разрешает Eloquent модели, определенные в маршрутах или действиях контроллера, имена переменных с подсказкой типа которых совпадают с именем участка маршрута. Например:
Так как переменная $user
имеет подсказку типа App\User
Eloquent модели, а имя переменной совпадает с URI сегментом {user}
, Laravel автоматически внедрит экземпляр модели, имеющий ID, совпадающий с соответствующим значением из URI запроса. Если соответствующий экземпляр модели не найден в базе данных, автоматически будет сгенерирован ответ HTTP 404.
Настройка ключа
Иногда вы можете захотеть разрешить модели Eloquent, используя колонку, отличную от id
. Для этого вы можете указать столбец в определении параметра маршрута:
Пользовательские ключи и область видимости
Иногда, при неявной привязке нескольких Eloquent моделей в одном определении маршрута, вы можете захотеть охватить вторую модель Элоквинта таким образом, что она должна быть дочерней по отношению к первой модели. Например, рассмотрим ситуацию, когда для конкретного пользователя получен пост в блоге с помощью slug:
При использовании неявной привязки по пользовательскому ключу в качестве вложенного параметра маршрута, Laravel автоматически выполнит запрос на получение вложенной модели от ее родителя, используя соглашения для угадывания имени отношения на родительском. В этом случае, предполагается, что модель User
имеет отношение с именем posts
(множественное число имени параметра маршрута), которое может быть использовано для получения модели Post
.
Настройка имени ключа по умолчанию
Если Вы хотите, чтобы привязка модели использовала столбец базы данных по умолчанию, отличный от id
, при получении заданного класса модели, Вы можете переопределить метод getRouteKeyName
на модели Eloquent:
Явная привязка
Для регистрации явной привязки используйте метод model
маршрутизатора, чтобы указать класс для данного параметра. Определение явной привязки модели необходимо делать в методе boot
класса RouteServiceProvider
:
Далее определите маршрут, содержащий параметр {user}
:
Так как мы привязали все параметры {user}
к модели App\User
, в маршрут будет вставлен экземпляр User
. Так, например, запрос к profile/1
будет внедрять экземпляр User
из базы данных, имеющей ID 1
.
Если соответствующий экземпляр модели не найден в базе данных, автоматически будет сгенерирован ответ HTTP 404.
Настройка логики разрешения
Если Вы хотите использовать свою собственную логику разрешения, то используйте метод Route::bind
. Функция обратного вызова, которую Вы передаете методу bind
, получит значение URI-сегмента и должна вернуть экземпляр класса, который должен быть внедрен в маршрут:
В качестве альтернативы, вы можете переопределить метод resolveRouteBinding
на модели Eloquent. Этот метод получит значение сегмента URI и должен вернуть экземпляр класса, который должен быть внедрен в маршрут:
Запасные маршруты
Используя метод Route::fallback
, вы можете определить маршрут, который будет выполняться, когда ни один другой маршрут не будет соответствовать входящему запросу. Обычно, необработанные запросы автоматически выводят страницу "404" через обработчик исключений вашего приложения. Однако, так как вы можете определить маршрут "отката" в файле routes/web.php
, все посредники в группе web
будут применяться к этому маршруту. Вы можете добавлять дополнительных посредников к этому маршруту по необходимости:
Запасной маршрут всегда должен быть последним маршрутом, зарегистрированным в вашем приложении.
Ограничение скорости
Laravel включает в себя посредника для ограничения доступа к маршрутам внутри приложения. Для начала, назначьте посредника throttle
маршруту или группе маршрутов. Этот посредник принимает два параметра, которые определяют максимальное количество запросов, которые могут быть сделаны в заданное количество минут. Например, укажем, что аутентифицированный пользователь может получить доступ к следующей группе маршрутов 60 раз в минуту:
Динамическое ограничение скорости
Вы можете указать динамический максимум запроса, основываясь на атрибуте аутентифицированной модели User
. Например, если Ваша User
модель содержит атрибут rate_limit
, Вы можете передать имя атрибута в посредник throttle
, чтобы оно использовалось для вычисления максимального количества запросов:
Различные ограничения для гостевых и аутентифицированных пользователей
Вы можете указать разные ограничения для гостевых и аутентифицированных пользователей. Например, Вы можете указать максимум 10
запросов в минуту для гостей и 60
для аутентифицированных пользователей:
Вы также можете комбинировать эту функциональность с динамическим ограничением скорости. Например, если Ваша User
модель содержит атрибут rate_limit
, Вы можете передать имя атрибута в throttle
промежуточное программное обеспечение, чтобы оно использовалось для вычисления максимального количества запросов для аутентифицированных пользователей:
Ограничения для сегментов
Обычно, вы укажете один лимит скорости для всего вашего API. Однако, ваше приложение может потребовать различных лимитов для разных сегментов вашего API. Если это так, то Вам нужно будет передать имя сегмента в качестве третьего аргумента в посредник throttle
:
Подмена метода запроса в формах
HTML формы не поддерживают действия PUT
, PATCH
или DELETE
. Поэтому при определении маршрутов PUT
, PATCH
или DELETE
, которые вызываются из HTML формы, вам нужно будет добавить в форму скрытое поле _method
. Значение, отправленное с полем _method
, будет использовано в качестве метода HTTP запроса:
Вы можете использовать Blade директиву @method
для генерации поля _method
:
Доступ к текущему маршруту
Вы можете использовать методы current
, currentRouteName
и currentRouteAction
на фасаде Route
для доступа к информации о маршруте, по которому обрабатывается входящий запрос:
Для просмотра всех доступных методов обратитесь к документации API класса фасада Route, и экземпляра Route.
Cross-Origin Resource Sharing (CORS)
Laravel может автоматически отвечать на запросы CORS OPTIONS значениями, которые вы настраиваете. Все настройки CORS могут быть сконфигурированы в конфигурационном файле cors
, а запросы OPTIONS будут автоматически обрабатываться посредником HandleCors
, который по умолчанию включен в глобальный стек посредников.
Для получения дополнительной информации о CORS и заголовках CORS обратитесь к документации MDN по CORS.
Last updated