Маршрутизация в Laravel 8: как это делать правильно

После прочтения этой статьи вы узнаете, как:

  • определять базовые маршруты в Laravel;
  • использовать основные HTTP методы;
  • обрабатывать маршруты с контроллерами и без;
  • задействовать параметры, имена и группы маршрутов.

Для понимания материала, изложенного в этой статье, необходимы базовые знания PHP, при этом навыков работы с Laravel не требуется. Предполагается, что Laravel и Composer у вас уже установлены.

Введение

Самая основная и важная функция серверных фреймворков – это способность получать запросы пользователя и возвращать ответы в виде HTML-страниц или даже документов JSON. Такое взаимодействие сервера и клиента возможно благодаря HTTP(S) маршрутизации: уже этот факт сам по себе объясняет степень важности маршрутов.

Laravel значительно упрощает определение маршрутов, передачу им кода на исполнение, а также решает множество других задач, связанных с маршрутизацией. По умолчанию Laravel при установке создает каталог для работы с маршрутами. Эта папка содержит четыре файла – api.php, channels.php, console.php и web.php. Первый файл (api.php) используется для обработки маршрутов API интерфейсов, остальные три – для всех остальных случаев. В этой статье мы сосредоточимся на файле web.php – все наши маршруты будут располагаться в нем.

Приступим

Создайте новый проект Laravel и откройте файл web.php. На вашем экране должно быть то же самое, что и у меня.

Базовый файл web.php в Laravel

Все, что мы здесь видим – ответ Laravel на запрос корневого маршрута вашего домена, «/». Используется замыкание, которое выдает содержимое файла welcome.blade.php из каталога views. Ниже мы рассмотрим полученный результат более подробно.

Определение маршрутов в Laravel

Маршруты в Laravel задаются с использованием класса Route и HTTP методов, маршрута для ответа, и замыкания (или метода контроллера).

Определение маршрута в Laravel

HTTP методы

Это действия для создания пользовательских HTTP запросов. В предыдущем примере вы уже видели методы GET и POST. Рассмотрим, какие функции выполняют эти и другие запросы.

GET – в основном используется для получения данных с сервера и их передачи пользователю без внесения каких-либо изменений.

POST – позволяет создавать новые ресурсы и записи на сервере, также может использоваться для отправки данных с целью дальнейшей обработки (например, для проверки информации или в процессе авторизации). Считается более безопасным методом отправки конфиденциальной информации, чем GET.

PUT – во многом метод аналогичен методу POST; отсылает данные на сервер, как правило, для обновления записей вместо создания новых.

DELETE – название этого метода говорит само за себя, он удаляет существующую запись из базы данных.

Замыкания

Замыкание – это, по сути, анонимная функция, которой не требуется имя для вызова. Могут передаваться как объекты, присваиваться переменным, или даже передаваться другим функциям или методам.

Можно написать все приложение с использованием замыканий, но из практических соображений рекомендуется использовать их лишь в самых небольших программах, так как весь код располагается в одном файле, что сделает логику нечитаемой.

Обработка маршрутов

С использованием замыканий

Независимо от используемой версии Laravel, это самый простой и понятный способ.

Обработка маршрутов с замыканиями

Обратите внимание на использование метода view(). В отличие от других фреймворков для создания веб-приложений, в которых необходимо указывать расположение каталога, содержащего пользовательские представления, Laravel все автоматически делает за вас и даже предоставляет простой метод для связи контроллера или замыкания с представлением.

Поэтому всякий раз, когда вы используете метод view (), Laravel возвращает шаблон Blade (.blade.php) или PHP-файл (.php) из каталога views.

С использованием контроллеров – Laravel 7

Этот способ, на мой взгляд, еще проще, чем метод для Laravel 8, но это только мое мнение.

В среде Laravel 7

С использованием контроллеров – Laravel 8

Почти то же самое, но с учетом синтаксических изменений в Laravel версии 8.

В среде Laravel 8

Еще одно различие – в Laravel 8, помимо представления второго параметра в виде массива, вам также потребуется импортировать контроллеры.

Файл routes.php в Laravel 8

Параметры маршрута

Довольно часто приходится иметь дело с динамическими маршрутами, которые используются для генерации одной страницы с динамическим контентом, передаваемым в маршруте. Параметры маршрута – это динамические сегменты в структуре URL-адреса.

Мы видим параметры маршрута каждый день, на многих сайтах. Facebook, Linkedin, Twitter, например, используют именно динамические маршруты. Laravel позволяет очень легко определять динамические маршруты, внося лишь некоторые изменения в базовое определение.

Параметры маршрута

Часть /users/ — это статическая часть маршрута, а фрагмент в фигурных скобках показывает, что он динамический — посещение /users/Zubair вернет «Hello Zubair».

Обратите внимание на то, как переменная была передана в замыкание. Параметры маршрута необязательно размещать в самом конце, их можно задавать где угодно.

Произвольное размещение параметров

Параметры маршрута с контроллерами

Маршрут определяется обычным способом, и метод контроллера тоже не претерпевает особых изменений, за исключением того, что ему передается аргумент (вместо того, чтобы оставить его пустым). Не забудьте импортировать контроллеры в файл web.php.

Параметры маршрута с контроллерами

Названия маршрутов

Laravel предусматривает очень простой и безопасный (возможно, лучший) способ ссылок на маршруты с использованием коротких имен, вместо постоянного использования полных маршрутов (фактических путей к ресурсам), что со временем ведет к путанице.

Каждому маршруту, определенному в файле web.php, может быть присвоено уникальное имя, которое избавляет от многих проблем, как показано в приведенном ниже примере.

Короткие названия маршрутов

Зачем использовать короткие названия маршрутов

Для этого есть несколько причин. Если пользователь набирает адрес в строке браузера, ему проще указать «users», например, вместо фактического пути «pages/users». Второе важное преимущество – простота разработки и обслуживания: всякий раз, когда вы меняете путь, не изменяя названия, фактический маршрут автоматически изменяется везде, где было упомянуто короткое название.

Помощник route()

В Laravel есть помощник route(), который помогает ссылаться на маршруты по их именам в вашем интерфейсном коде.

Присвоение имени маршруту в Laravel 8

Обратите внимание на то, как название маршрута было использовано вместо фактического пути. Если в реальный путь в дальнейшем будут внесены изменения, редактирование кода не потребуется.

Использование параметров в именованных маршрутах

На самом деле нет никакой разницы в использовании параметров, поскольку вы просто даете название существующему, определенному маршруту. Всю работу в пользовательской части приложения выполняет помощник route(), и вот так вы передаете ему параметры.

Передача параметров в именованных маршрутах

Предположим, что метод или замыкание принимают больше одного параметра. Несколько параметров вы можете передать следующими способами:

  1. Можно упорядочить параметры в массиве помощника route() так же, как они были упорядочены в замыкании или методе.
  2. Вы также можете создать ассоциативный массив с параметрами в виде ключей и соответствующими им значениями.

Использование строк запросов с именованными маршрутами

С передачей строк запросов именованным маршрутам в Laravel все обстоит очень просто.

Передача строк запросов именованным маршрутам

Строка запроса передается как обычный элемент массива, если в замыкании нет соответствующего параметра. Если в замыкании присутствует «?», оно прикрепляется как строка запроса.

Вот и все на сегодня, спасибо за внимание. Если у вас есть какие-либо вопросы или советы, пожалуйста, оставьте их в комментариях к этой статье.

Пожалуйста, опубликуйте свои отзывы по текущей теме материала. Мы крайне благодарны вам за ваши комментарии, отклики, дизлайки, лайки, подписки!

Данная публикация является переводом статьи «Routing In Laravel 8» , подготовленная редакцией проекта.

Меню