Урок 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');
    });
});
Подписанные роуты

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

Есть три способа отправить эту ссылку:

  1. Сделайте этот URL общедоступным и надейтесь, что никто другой не обнаружит URL-адрес утверждения или не изменит свой собственный URL-адрес утверждения, чтобы утвердить кого-то другого.
  2. Поместите действие за аутентификацию, ссылку на действие и потребуйте, чтобы пользователь вошел в систему, если он еще не вошел в систему (что в этом случае может быть невозможно, так как многие получатели списка рассылки, скорее всего, не будут пользователями).
  3. “Подпишите” ссылку, чтобы она однозначно доказывала, что пользователь получил ссылку с вашего электронного письма, без необходимости входа в систему; что-то вроде http://upread.ru/invitations/5816/yes?signature=030ab0ee6a8237bd86a8re8.
Один из простых способов выполнить последний вариант - использовать функцию, представленную в Laravel 5.6.12, под названием подписанные URL-адреса, которая упрощает создание системы аутентификации подписи для отправки аутентифицированных ссылок. Эти ссылки состоят из обычной ссылки маршрута с добавленной “подписью”, которая доказывает, что URL-адрес не был посещен с момента его отправки (и, следовательно, никто не посещал URL-адрес для доступа к чужой информации).

Подписание маршрута

Чтобы создать подписанный 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, уроки по Laravel, маршрутизация, php




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Обустройство крыши дома - этапы работы
Урок 41. Специализированные коллекции C#
Подключение Xdebug и NetBeans