Урок 14. Префиксы, поддомены и подписанные роуты в Laravel
На это уроке из серии уроков по Laravel мы закончим с основами маршрутизации и познакомимся с такими понятиями как префиксы путей, роутинг поддоменов и подписанные роуты.
Префиксы путей
Если у вас есть группа маршрутов, которые разделяют сегмент своего пути, например, если панель мониторинга вашего сайта имеет префикс /панель мониторинга, вы можете использовать группы маршрутов для упрощения этой структуры
Добавление префикса к группе маршрутов
Route::prefix('dashboard')->group(function () { Route::get('/', function () { // Handles the path /dashboard }); Route::get('users', function () { // Handles the path /dashboard/users }); });Обратите внимание, что каждая группа с префиксами также имеет / маршрут, представляющий корень префикса, в примере выше — это /dashboard.
Резервные роуты
В Laravel до версии 5.6 вы могли определить “запасной маршрут” (который вам нужно определить в конце файла маршрутов), чтобы перехватить все несопоставимые пути:
Route::any('{anything}', 'CatchAllController')->where('anything', '*');В Laravel 5.6+ вместо этого вы можете использовать метод Route::fallback() :
Route::fallback(function () { // });Роутинг поддоменов
Маршрутизация поддоменов аналогична префиксу маршрута, но область ее действия определяется поддоменом, а не префиксом маршрута. Для этого есть два основных применения. Во-первых, вы можете захотеть представить разные разделы приложения (или совершенно разные приложения) в разных поддоменах. Пример ниже показывает, как вы можете этого достичь.
Маршрутизация поддоменов
Route::domain('api.myapp.com')->group(function () { Route::get('/', function () { // }); });Во-вторых, вы можете задать часть поддомена в качестве параметра, как показано в коде ниже. Чаще всего это делается в случаях мультитенантности (например, Slack или Harvest, где каждая компания получает свой собственный поддомен, например, tighten.slack.co).
Параметризованная маршрутизация поддоменов
Route::domain('{account}.myapp.com')->group(function () { Route::get('/', function ($account) { // }); Route::get('users/{id}', function ($account, $id) { // }); });Обратите внимание, что любые параметры для группы передаются в методы сгруппированных маршрутов в качестве первого параметра(ов).
Префиксы пространства имен
Когда вы группируете роуты по поддомену или префиксу маршрута, вполне вероятно, что их контроллеры имеют аналогичное пространство имен PHP. В примере панели мониторинга все контроллеры маршрутов панели мониторинга могут находиться в пространстве имен панели мониторинга. Используя префикс пространства имен группы маршрутов, вы можете избежать длинных ссылок на контроллеры в таких группах, как "Dashboard/UsersController@index" и "Dashboard/PurchasesController@index"
Префиксы пространства имен группы маршрутов
// App\Http\Controllers\UsersController Route::get('/', 'UsersController@index'); Route::namespace('Dashboard')->group(function () { // App\Http\Controllers\Dashboard\PurchasesController Route::get('dashboard/purchases', 'PurchasesController@index'); });Префиксы имен
Префиксы на этом не заканчиваются. Обычно имена маршрутов отражают цепочку наследования элементов пути, поэтому users/comments/6 будут обслуживаться маршрутом с именем users.comments.show. В этом случае обычно используется группа маршрутов вокруг всех маршрутов, которые находятся под ресурсом users.comments.
Точно так же, как мы можем добавлять префиксы к сегментам URL и пространствам имен контроллеров, мы также можем добавлять префиксы к имени маршрута. С помощью префиксов имен групп маршрутов мы можем определить, что каждый маршрут в этой группе должен иметь заданную строку с префиксом к своему имени. В этом контексте мы ставим префикс "пользователи". к названию каждого маршрута, затем "комментарии".
Префиксы имен групп маршрутов
Route::name('users.')->prefix('users')->group(function () { Route::name('comments.')->prefix('comments')->group(function () { Route::get('{id}', function () { })->name('show'); }); });Подписанные роуты
Многие приложения регулярно отправляют уведомления о разовых действиях (сброс пароля, принятие приглашения и т.д.) и предоставляют простые ссылки для выполнения этих действий. Давайте представим, что отправили электронное письмо, подтверждающее, что получатель был готов быть добавленным в список рассылки.
Есть три способа отправить эту ссылку:
- Сделайте этот URL общедоступным и надейтесь, что никто другой не обнаружит URL-адрес утверждения или не изменит свой собственный URL-адрес утверждения, чтобы утвердить кого-то другого.
- Поместите действие за аутентификацию, ссылку на действие и потребуйте, чтобы пользователь вошел в систему, если он еще не вошел в систему (что в этом случае может быть невозможно, так как многие получатели списка рассылки, скорее всего, не будут пользователями).
- “Подпишите” ссылку, чтобы она однозначно доказывала, что пользователь получил ссылку с вашего электронного письма, без необходимости входа в систему; что-то вроде http://upread.ru/invitations/5816/yes?signature=030ab0ee6a8237bd86a8re8.
Подписание маршрута
Чтобы создать подписанный URL-адрес для доступа к заданному маршруту, маршрут должен иметь имя:
Route::get('invitations/{invitation}/{answer}', 'InvitationController') ->name('invitations');Чтобы создать обычную ссылку на этот маршрут, вы бы использовали помощник route (), как мы уже рассмотрели, но вы также могли бы использовать фасад URL для того же: URL::маршрут ("приглашения", ["приглашение" = > 12345, "ответ" = > "да"]). Чтобы создать подписанную ссылку на этот маршрут, просто используйте вместо этого метод signedRoute (). И если вы хотите создать подписанный маршрут с истекающим сроком действия, используйте temporarySignedRoute():
// Создать обычную ссылку URL::route('invitations', ['invitation' => 12345, 'answer' => 'yes']); // Создать подписанную ссылку URL::signedRoute('invitations', ['invitation' => 12345, 'answer' => 'yes']); // Создать истекающую (временную) подписанную ссылку URL::temporarySignedRoute( 'invitations', now()->addHours(4), ['invitation' => 12345, 'answer' => 'yes'] );Использование хелпера NOW()
Начиная с версии 5.5 Laravel предлагает помощник now (), который эквивалентен Carbon::now(); он возвращает объект Carbon, представляющий сегодняшний день, прямо в эту секунду. Если вы работаете с Laravel до версии 5.5, вы можете заменить любой экземпляр now() на Carbon::now().
Carbon, если вы с ним не знакомы, - это библиотека datetime, которая входит в состав Laravel.
Изменение маршрутов для разрешения подписанных ссылок
Теперь, когда вы создали ссылку на свой подписанный маршрут, вам необходимо защитить его от любого неподписанного доступа. Самый простой вариант - применить подписанное промежуточное программное обеспечение (которое, если его нет в вашем массиве $routeMiddleware в app/Http/Kernel.php, должно быть, подкреплено Illuminate\Routing\Middleware\ValidateSignature):
Route::get('invitations/{invitation}/{answer}', 'InvitationController') ->name('invitations') ->middleware('signed');Если вы предпочитаете, вы можете выполнить проверку вручную с помощью метода hasValidSignature() для объекта запроса вместо использования подписанного промежуточного программного обеспечения:
class InvitationController { public function __invoke(Invitation $invitation, $answer, Request $request) { if (! $request->hasValidSignature()) { abort(403); } // } }
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Читайте также:
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.