Метод handle
Метод handle является основным методом любого middleware в Laravel. Он принимает объект запроса и замыкание, которое передаёт запрос дальше по цепочке middleware. Метод может выполнять проверки, изменять запрос или прерывать выполнение, возвращая ответ. Первым параметром передаётся объект Request, вторым - замыкание next.
Синтаксис
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class ExampleMiddleware
{
public function handle(Request $request, Closure $next)
{
// Действия до выполнения запроса
$response = $next($request);
// Действия после выполнения запроса
return $response;
}
}
?>
Пример 1
Создадим middleware, которое проверяет наличие заголовка 'X-API-Key' и возвращает ошибку, если ключ отсутствует:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class CheckApiKey
{
public function handle(Request $request, Closure $next): Response
{
$apiKey = $request->header('X-API-Key');
if ($apiKey !== 'secret-key-123') {
return response()->json([
'error' => 'Invalid API key'
], 401);
}
return $next($request);
}
}
?>
Результат выполнения кода при неверном ключе:
{"error": "Invalid API key"}
Пример 2
Создадим middleware, которое добавляет заголовок к ответу после обработки запроса:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class AddCustomHeader
{
public function handle(Request $request, Closure $next): Response
{
$response = $next($request);
$response->headers->set('X-Processing-Time', microtime(true));
return $response;
}
}
?>
Пример 3
Создадим middleware, которое логирует информацию о запросе и перенаправляет пользователя, если запрос выполняется из определённого IP-адреса:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Symfony\Component\HttpFoundation\Response;
class BlockIpAddress
{
protected $blockedIps = ['192.168.1.100', '10.0.0.5'];
public function handle(Request $request, Closure $next): Response
{
$ip = $request->ip();
Log::info('Request from IP: ' . $ip);
if (in_array($ip, $this->blockedIps)) {
return redirect('/blocked');
}
return $next($request);
}
}
?>
Смотрите также
-
метод
terminate,
который выполняется после отправки ответа клиенту -
метод
throttle,
который ограничивает количество запросов -
метод
signed,
который проверяет подпись URL -
метод
ValidateCsrfToken,
который проверяет CSRF-токен