На нашем сайте мы используем cookie для сбора информации технического характера и обрабатываем IP-адрес вашего местоположения. Продолжая использовать этот сайт, вы даете согласие на использование файлов cookies. Здесь вы можете узнать, как мы пользуемся файлами cookies.
Я согласен
логотип upread.ru

Урок 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

Читайте также:




Как записать информацию в файл на Java
Урок 3. Типы данных JavaScript


© upread.ru 2013-2022
При перепечатке активная ссылка на сайт обязательна.
Задать вопрос
письмо
Здравствуйте! Вы можете задать мне любой вопрос. Если не получается отправить сообщение через эту форму, то пишите на почу up777up@yandex.ru
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.