Метод terminate
Метод terminate применяется в middleware Laravel
и вызывается автоматически после того, как HTTP-ответ
был отправлен браузеру. Это позволяет выполнять
ресурсоёмкие операции, не замедляя ответ сервера.
Метод принимает два параметра: объект запроса
Request и объект ответа Response.
Синтаксис
<?php
public function terminate($request, $response)
{
// завершающий код
}
?>
Пример
Давайте создадим middleware, который логирует время выполнения запроса:
<?php
namespace AppHttpMiddleware;
use Closure;
use IlluminateHttpRequest;
class LogExecutionTime
{
public function handle(Request $request, Closure $next)
{
$request->startTime = microtime(true);
return $next($request);
}
public function terminate($request, $response)
{
$executionTime = microtime(true) - $request->startTime;
$logMessage = "Request took " . round($executionTime, 4) . " seconds";
error_log($logMessage);
}
}
?>
Результат выполнения кода:
"Request took 0.0235 seconds"
Пример
Давайте отправим уведомление администратору после завершения запроса:
<?php
namespace AppHttpMiddleware;
use Closure;
use IlluminateHttpRequest;
use AppServicesNotificationService;
class NotifyAdmin
{
protected $notifier;
public function __construct(NotificationService $notifier)
{
$this->notifier = $notifier;
}
public function handle(Request $request, Closure $next)
{
return $next($request);
}
public function terminate($request, $response)
{
if ($response->status() >= 500) {
$this->notifier->sendAlert(
"Server error occurred",
"Error: " . $response->status()
);
}
}
}
?>
Пример
Давайте запишем в базу данных статистику посещений страниц:
<?php
namespace AppHttpMiddleware;
use Closure;
use IlluminateHttpRequest;
use AppModelsPageView;
class PageStatistics
{
public function handle(Request $request, Closure $next)
{
return $next($request);
}
public function terminate($request, $response)
{
PageView::create([
'url' => $request->fullUrl(),
'method' => $request->method(),
'ip' => $request->ip(),
'status' => $response->status(),
'user_agent' => $request->userAgent()
]);
}
}
?>
Результат выполнения кода:
"Page view recorded successfully"