Статьи

Понимать основы промежуточного программного обеспечения Laravel

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

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

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

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

Так в чем же смысл подключаться к потоку обработки запросов Laravel? Подумайте о чем-то, что требует выполнения на ранних этапах начальной загрузки приложения. Например, необходимо проверять подлинность пользователей на ранних этапах, чтобы решить, разрешен ли им доступ к текущему маршруту.

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

  • регистрация запросов
  • перенаправление пользователей
  • изменение / дезинфекция входящих параметров
  • манипулирование ответом, генерируемым приложением Laravel
  • и многое другое

На самом деле, приложение Laravel по умолчанию уже содержит в себе пару важных компонентов промежуточного программного обеспечения. Например, есть промежуточное ПО, которое проверяет, находится ли сайт в режиме обслуживания. С другой стороны, существует промежуточное программное обеспечение для очистки параметров запроса ввода. Как я упоминал ранее, аутентификация пользователя также обеспечивается самим промежуточным программным обеспечением.

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

В этом разделе мы создадим наше собственное промежуточное программное обеспечение. Но что именно будет достигать наше специальное промежуточное программное обеспечение?

Недавно я столкнулся с пользовательским требованием моего клиента, что если пользователи получают доступ к сайту с любого мобильного устройства, они должны быть перенаправлены на соответствующий URL-адрес субдомена со всеми параметрами строки запроса без изменений. Я считаю, что это идеальный вариант использования, чтобы продемонстрировать, как промежуточное ПО Laravel можно использовать в этом конкретном сценарии.

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

Обсудив всю эту теорию, давайте перейдем к реальному развитию, и это лучший способ понять новую концепцию, не так ли?

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

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

1
php artisan make:middleware MobileRedirect

И это должно создать файл app/Http/Middleware/MobileRedirect.php со следующим кодом.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
<?php
  
namespace App\Http\Middleware;
  
use Closure;
  
class MobileRedirect
{
    /**
     * Handle an incoming request.
     *
     * @param \Illuminate\Http\Request $request
     * @param \Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}

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

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

Как следует из названия, промежуточное программное обеспечение before — это то, что выполняется до того, как запрос действительно обработан и ответ сформирован. С другой стороны, промежуточное программное обеспечение запускается после того, как приложение обработало запрос, и ответ уже сформирован.

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

Идите дальше и измените файл app/Http/Middleware/MobileRedirect.php следующим содержимым.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
  
namespace App\Http\Middleware;
  
use Closure;
  
class MobileRedirect
{
    /**
     * Handle an incoming request.
     *
     * @param \Illuminate\Http\Request $request
     * @param \Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // check if the request is from mobile device
        if ($request->mobile == «1») {
            return redirect(‘mobile-site-url-goes-here’);
        }
  
        return $next($request);
    }
}

Для простоты мы просто проверяем наличие параметра строки mobile запроса, и если он установлен в значение TRUE , пользователь будет перенаправлен на соответствующий URL-адрес мобильного сайта. Конечно, вы хотели бы использовать библиотеку обнаружения пользовательских агентов, если хотите обнаруживать ее в режиме реального времени.

Кроме того, вы хотели бы заменить маршрут mobile-site-url-goes-here соответствующим маршрутом или URL-адресом, так как это просто заполнитель для демонстрационных целей.

Следуя нашей пользовательской логике, есть вызов $next($request) который позволяет обрабатывать запрос дальше в цепочке приложений. В нашем случае важно отметить, что мы разместили логику обнаружения мобильных устройств перед вызовом $next($request) , что фактически делает ее промежуточным программным обеспечением.

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
  
namespace App\Http\Middleware;
  
use Closure;
  
class CustomMiddleWare
{
    /**
     * Handle an incoming request.
     *
     * @param \Illuminate\Http\Request $request
     * @param \Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);
         
        /* your custom logic goes here */
         
        return $response;
    }
}

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

Так что это была история после промежуточного программного обеспечения.

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

Откройте файл app/Http/Kernel.php и найдите следующий фрагмент.

01
02
03
04
05
06
07
08
09
10
11
12
13
/**
 * The application’s global HTTP middleware stack.
 *
 * These middleware are run during every request to your application.
 *
 * @var array
 */
protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];

Как вы можете видеть, $middleware содержит массив промежуточного программного обеспечения, который поставляется с установленной по умолчанию установкой Laravel. Перечисленное здесь промежуточное программное обеспечение будет выполняться при каждом запросе Laravel, и, таким образом, это идеальный кандидат для размещения нашего собственного промежуточного программного обеспечения.

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

1
2
3
4
5
6
7
protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    \App\Http\Middleware\MobileRedirect::class,
];

Теперь попробуйте получить доступ к любому из ваших маршрутов Laravel с помощью строки запроса mobile=1 , и это должно запустить наш код промежуточного программного обеспечения!

Вот как вы должны зарегистрировать свое промежуточное программное обеспечение, которое должно запускаться при каждом запросе. Однако иногда вы хотите запускать ваше промежуточное ПО только для определенных маршрутов. Давайте проверим, как этого добиться, используя $routeMiddleware .

В контексте нашего текущего примера давайте предположим, что пользователи будут перенаправлены на мобильный сайт, если они получат доступ к какому-либо конкретному маршруту на вашем сайте. В этом случае вы не хотите включать ваше промежуточное ПО в список $middleware .

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

1
Route::get(‘/hello-world’, ‘HelloWorldController@index’)->middleware(\App\Http\Middleware\MobileRedirect::class);

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

Откройте файл app/Http/Kernel.php и найдите $routeMiddleware который содержит сопоставления псевдонимов промежуточному программному обеспечению. Давайте включим нашу запись в этот список, как показано в следующем фрагменте.

1
2
3
4
5
6
7
8
9
protected $routeMiddleware = [
    ‘auth’ => \Illuminate\Auth\Middleware\Authenticate::class,
    ‘auth.basic’ => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    ‘bindings’ => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ‘can’ => \Illuminate\Auth\Middleware\Authorize::class,
    ‘guest’ => \App\Http\Middleware\RedirectIfAuthenticated::class,
    ‘throttle’ => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    ‘mobile.redirect’ => \App\Http\Middleware\MobileRedirect::class
];

И пересмотренное определение маршрута выглядит следующим образом.

1
Route::get(‘/hello-world’, ‘HelloWorldController@index’)->middleware(‘mobile.redirect’);

И это история регистрации промежуточного программного обеспечения в приложении Laravel. Это было довольно просто, не так ли?

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

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

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

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

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