![]() |
Урок 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-адрес для доступа к заданному маршруту, маршрут должен иметь имя: 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда. ![]() Читайте также:
|
Мои услуги
|
© upread.ru 2013-2022 При перепечатке активная ссылка на сайт обязательна. |