Что такое 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
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.
