Встречается на 33% собеседований по PHP

Что такое middleware

Middleware (посредник) — это программный слой, который перехватывает HTTP-запросы и ответы, выполняя определённые действия до того, как запрос достигнет приложения, или после того, как ответ сформирован. В контексте веб-фреймворков, таких как Laravel, middleware выступает в роли фильтра, который может проверять, модифицировать или отклонять запросы, а также добавлять заголовки к ответам. Например, middleware аутентификации проверяет, авторизован ли пользователь, и если нет — перенаправляет его на страницу входа, а если да — пропускает запрос дальше по цепочке.

Как это работает

Middleware организуется в цепочку (стек). Каждый middleware получает запрос, выполняет свою логику и либо передаёт запрос следующему middleware (вызывая $next($request)), либо возвращает ответ, прерывая цепочку. В Laravel middleware определяется как класс с методом handle, который принимает запрос и замыкание $next. Порядок middleware задаётся в app/Http/Kernel.php — глобальные middleware применяются ко всем запросам, а middleware групп — к определённым маршрутам.

Пример middleware в Laravel:

php
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class CheckAge
{
    /**
     * Обработка входящего запроса.
     */
    public function handle(Request $request, Closure $next)
    {
        if ($request->age < 18) {
            return redirect('home'); // прерываем цепочку
        }

        return $next($request); // передаём запрос дальше
    }
}

Примеры использования

  • Аутентификация: проверка, залогинен ли пользователь; если нет — редирект на страницу входа.
  • Авторизация: проверка прав доступа к определённым маршрутам (например, только администраторы).
  • Логирование: запись информации о каждом запросе (метод, URL, время).
  • CORS: добавление заголовков Access-Control-Allow-Origin и других к ответу для поддержки кросс-доменных запросов.
  • CSRF-защита: проверка токена в POST-запросах для предотвращения межсайтовой подделки запросов.
  • Режим обслуживания: временное отключение сайта с показом заглушки.

В Laravel уже есть несколько встроенных middleware в папке app/Http/Middleware, например Authenticate, VerifyCsrfToken, CheckForMaintenanceMode.

Подводные камни

  • Порядок middleware важен: если middleware, который добавляет CORS-заголовки, стоит после middleware, который завершает запрос, заголовки не будут добавлены.
  • Не забывайте вызывать $next($request): если middleware не передаст запрос дальше, приложение не получит запрос, и пользователь увидит пустой ответ.
  • Middleware может быть тяжёлым: если в middleware выполнять сложные операции (например, обращение к БД), это замедлит каждый запрос. Старайтесь держать middleware лёгким.
  • Не дублируйте логику: если одна и та же проверка нужна в разных местах, вынесите её в middleware, а не копируйте в контроллеры.

Когда использовать

Middleware подходит для сквозных задач, которые затрагивают множество маршрутов: аутентификация, логирование, модификация заголовков. Если задача относится только к одному действию, лучше реализовать её в контроллере или сервисе. Также middleware удобен для обработки запросов до того, как они попадут в контроллер, что позволяет централизованно управлять политиками безопасности.

Коротко

  • Middleware — это фильтры HTTP-запросов, работающие по принципу цепочки.
  • В Laravel middleware — класс с методом handle, который вызывает $next($request) для передачи запроса дальше.
  • Применяется для аутентификации, логирования, CORS, CSRF-защиты и других сквозных задач.
  • Важно следить за порядком middleware и не забывать вызывать $next.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы