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

Опубликовано: 2022-12-12

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

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

Давайте внимательно рассмотрим, как управлять маршрутами в Laravel.

Бэкэнд-маршрутизация и межсайтовый скриптинг в Laravel

На сервере существуют как общедоступные, так и частные маршруты. Общедоступные маршруты могут быть причиной беспокойства из-за возможности межсайтового скриптинга (XSS) — типа атаки путем внедрения, которая может сделать вас и ваших пользователей уязвимыми для злоумышленников.

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

Самый простой способ решить эту проблему — применить новый HTTP-заголовок, добавив «referrer» к маршруту, чтобы смягчить этот сценарий:

 'main' => [ 'path' => '/main', 'referrer' => 'required,refresh-empty', 'target' => Controller\DashboardController::class . '::mainAction' ]

Базовая маршрутизация Laravel

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

В Laravel маршруты создаются внутри файлов web.php и api.php . Laravel по умолчанию имеет два маршрута: один для WEB и один для API.

Эти маршруты находятся в папке route/ , но загружаются они в Providers/RouteServiceProvider.php .

Командная строка, показывающая состояние поставщика услуг маршрутизации Laravel по умолчанию.
Состояние поставщика услуг маршрутизации Laravel по умолчанию.

Вместо этого мы можем загружать маршруты непосредственно в RouteServiceProvider.php , полностью пропуская route/ folder.

Окно командной строки, показывающее загрузку маршрутов Laravel непосредственно в провайдере.
Загрузка маршрутов Laravel непосредственно в провайдере.

перенаправляет

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

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

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

 // Simple redirect Route::redirect("/class", "/myClass"); // Redirect with custom status Route::redirect("/home", "/office", 305); // Route redirect with 301 status code Route::permanentRedirect("/home", "office");

Внутри маршрутов перенаправления нам запрещено использовать ключевые слова «destination» и «status» в качестве параметров, поскольку они зарезервированы Laravel.

 // Illegal to use Route::redirect("/home", "/office/{status}");

Просмотры

Просмотры — это . blade.php , которые мы используем для рендеринга внешнего интерфейса нашего приложения Laravel. Он использует механизм шаблонов блейдов, и это способ по умолчанию для создания приложения с полным стеком, используя только Laravel.

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

 // When the user accesses my-domain.com/homepage // the homepage.blade.php file will be rendered Route::view("/homepage", "homepage");

Предположим, наше представление хочет сказать «Привет, {name} », передав необязательный массив с этим параметром. Мы можем сделать это с помощью следующего кода (если в представлении требуется отсутствующий параметр, запрос завершится неудачно и выдаст ошибку):

 Route::view('/homepage', 'homepage', ['name' => "Kinsta"]);

Список маршрутов

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

Здесь нам может помочь artisan route:list command . Он предоставляет обзор всех маршрутов, определенных в приложении, их промежуточного программного обеспечения и контроллеров.

 php artisan route:list

Он отобразит список всех маршрутов без промежуточного программного обеспечения. Для этого мы должны использовать флаг -v :

 php artisan route:list -v

В ситуации, когда вы можете использовать дизайн, управляемый доменом, где ваши маршруты имеют определенные имена в своих путях, вы можете использовать возможности фильтрации этой команды следующим образом:

 php artisan route:list –path=api/account

Это покажет только маршруты, которые начинаются с api/account .

С другой стороны, мы можем дать указание Laravel исключить или включить маршруты, определенные третьими сторонами, используя параметры –except-vendor или –only-vendor .

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

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

Если наши маршруты имеют зависимости внутри своих обратных вызовов, сервисный контейнер Laravel автоматически внедрит их:

 use Illuminate\Http\Request; use Controllers/DashboardController; Route::post('/dashboard/{id}, function (Request $request, string $id) { return 'User:' . $id; } Route::get('/dashboard/{id}, DashboardController.php);

Требуемые параметры

Обязательные параметры Laravel — это параметры в маршрутах, которые нам не разрешено пропускать при выполнении вызова. В противном случае будет выброшена ошибка:

 Route::post("/gdpr/{userId}", GetGdprDataController.php");

Теперь внутри GetGdprDataController.php у нас будет прямой доступ к параметру $userId .

 public function __invoke(int $userId) { // Use the userId that we received… }

Маршрут может принимать любое количество параметров. Они вводятся в обратные вызовы/контроллеры маршрута в зависимости от порядка, в котором они перечислены:

 // api.php Route::post('/gdpr/{userId}/{userName}/{userAge}', GetGdprDataController.php); // GetGdprDataController.php public function __invoke(int $userId, string $userName, int $userAge) { // Use the parameters… }

Дополнительные параметры

В ситуации, когда мы хотим что-то сделать на маршруте, когда присутствует только параметр и больше ничего, и все это не влияет на все приложение, мы можем добавить необязательный параметр. Эти необязательные параметры обозначаются знаком ? к ним прилагается:

 Route::get('/user/{age?}', function (int $age = null) { if (!$age) Log::info("User doesn't have age set"); else Log::info("User's age is " . $age); } Route::get('/user/{name?}', function (int $name = "John Doe") { Log::info("User's name is " . $name); }

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

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

Скажем, нам нужна строка идентификатора пользователя. Мы можем проверить это на уровне маршрута, используя метод where .

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

 Route::get('/user/{age}', function (int $age) { // }->where('age', '[0-9]+'); Route::get('/user/{age}', function (int $age) { // }->where('[0-9]+'); Route::get('/user/{age}/{name}', function (int $age, string $name) { // }->where(['age' => '[0-9]+', 'name' => '[az][Az]+');

Мы можем сделать еще один шаг вперед и применить проверку ко всем маршрутам в нашем приложении, используя метод pattern на фасаде Route :

 Route::pattern('id', '[0-9]+');

Это проверит каждый параметр id с этим выражением регулярного выражения. И как только мы его определим, он будет автоматически применяться ко всем маршрутам, использующим это имя параметра.

Как мы видим, Laravel использует символ / в качестве разделителя в пути. Если мы хотим использовать его в пути, мы должны явно разрешить ему быть частью нашего заполнителя, используя регулярное выражение where .

 Route::get('/find/{query}', function ($query) { // })->where('query', , '.*');

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

Именованные маршруты

Как следует из названия, мы можем называть маршруты, что упрощает создание URL-адресов или перенаправление для определенных маршрутов.

Боретесь с простоями и проблемами WordPress? Kinsta — это решение для хостинга, предназначенное для экономии вашего времени! Ознакомьтесь с нашими функциями

Как создать именованные маршруты

Простой способ создания именованного маршрута предоставляется с помощью метода name , связанного с фасадом Route . Имя каждого маршрута должно быть уникальным:

 Route::get('/', function () { })->name("homepage");

Группы маршрутов

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

ПО промежуточного слоя

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

 Route:middleware(['AuthMiddleware', 'SessionMiddleware'])->group(function () { Route::get('/', function() {} ); Route::post('/upload-picture', function () {} ); });

Контроллеры

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

 Route::controller(UserController::class)->group(function () { Route::get('/orders/{userId}', 'getOrders'); Route::post('/order/{id}', 'postOrder'); });

Маршрутизация поддоменов

Имя субдомена — это часть дополнительной информации, добавляемая в начало доменного имени веб-сайта. Это позволяет веб-сайтам отделять и организовывать свой контент для определенных функций, таких как интернет-магазины, блоги, презентации и т. д., от остальной части веб-сайта.

Наши маршруты можно использовать для обработки маршрутизации поддоменов. Мы можем перехватить домен и часть поддомена для использования в нашем контроллере и маршруте. С помощью метода domain на фасаде Route мы можем сгруппировать наши маршруты в одном домене:

 Route::domain('{store}.enterprise.com')->group(function() { Route::get('order/{id}', function (Account $account, string $id) { // Your Code } });

Префиксы и префиксы имен

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

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

Это позволяет нам создавать новые вещи, такие как административные маршруты, без необходимости изменять каждое имя или префикс для их идентификации:

 Route::name('admin.")->group(function() { Route::prefix("admin")->group(function() { Route::get('/get')->name('get'); Route::put('/put')->name(put'); Route::post('/post')->name('post'); }); });

Теперь URI для этих маршрутов будут admin/get , admin/put , admin/post и имена admin.get , admin.put и admin.post .

Кэширование маршрута

При развертывании приложения на рабочих серверах хороший разработчик Laravel воспользуется кэшем маршрутов Laravel.

Что такое кэширование маршрута?

Кэширование маршрутов сокращает время, необходимое для регистрации всех маршрутов приложений.

При запуске php artisan route:cache создается экземпляр Illuminate/Routing/RouteCollection , и после кодирования сериализованный вывод записывается в bootstrap/cache.routes.php .

Теперь любой другой запрос будет загружать этот файл кеша, если он существует. Поэтому нашему приложению больше не нужно анализировать и преобразовывать записи из файла маршрута в объекты Illuminate/Routing/Route в Illuminate/Routing/RouteCollection .

Почему важно использовать кэширование маршрутов

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

В зависимости от масштаба вашего проекта и количества маршрутов запуск простой команды кэширования маршрутов может ускорить ваше приложение где-то от 130% до 500% — огромный выигрыш практически без усилий.

Резюме

Маршрутизация является основой серверной разработки. Фреймворк Laravel превосходен в этом, предоставляя подробный способ определения и управления маршрутами. Познакомьтесь с маршрутизацией Laravel в этом подробном руководстве Click to Tweet

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

С какими еще хитростями и советами вы сталкивались в отношении маршрутов Laravel? Дайте нам знать в разделе комментариев!