/
githubmirror
/
framework
Обзор
Документация
Войти
/
githubmirror
/
framework
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
13.x
src/Illuminate/Foundation/Http/Middleware/HandlePrecognitiveRequests.php
104 строки
3 KB
Hans van Luttikhuizen-Ross
[12.x] Restore original dispatcher bindings after precognitive request (#58716)
09 фев 2026, 23:47
Не верифицирован
09 фев 2026, 23:47
717a176
Код
Авторство
О чём код?
<?php namespace Illuminate\Foundation\Http\Middleware; use Illuminate\Container\Container; use Illuminate\Foundation\Routing\PrecognitionCallableDispatcher; use Illuminate\Foundation\Routing\PrecognitionControllerDispatcher; use Illuminate\Routing\Contracts\CallableDispatcher as CallableDispatcherContract; use Illuminate\Routing\Contracts\ControllerDispatcher as ControllerDispatcherContract; class HandlePrecognitiveRequests { /** * The container instance. * * @var \Illuminate\Container\Container */ protected $container; /** * Create a new middleware instance. * * @param \Illuminate\Container\Container $container */ public function __construct(Container $container) { $this->container = $container; } /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return \Illuminate\Http\Response */ public function handle($request, $next) { if (! $request->isAttemptingPrecognition()) { return $this->appendVaryHeader($request, $next($request)); } $bindings = $this->container->getBindings(); $callableBinding = $bindings[CallableDispatcherContract::class] ?? null; $controllerBinding = $bindings[ControllerDispatcherContract::class] ?? null; $this->prepareForPrecognition($request); return tap($next($request), function ($response) use ($request, $callableBinding, $controllerBinding) { $response->headers->set('Precognition', 'true'); $this->appendVaryHeader($request, $response); $this->restoreDispatchers($callableBinding, $controllerBinding); }); } /** * Prepare to handle a precognitive request. * * @param \Illuminate\Http\Request $request * @return void */ protected function prepareForPrecognition($request) { $request->attributes->set('precognitive', true); $this->container->bind(CallableDispatcherContract::class, fn ($app) => new PrecognitionCallableDispatcher($app)); $this->container->bind(ControllerDispatcherContract::class, fn ($app) => new PrecognitionControllerDispatcher($app)); } /** * Append the appropriate "Vary" header to the given response. * * @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Response $response * @return \Illuminate\Http\Response */ protected function appendVaryHeader($request, $response) { return tap($response, fn () => $response->headers->set('Vary', implode(', ', array_filter([ $response->headers->get('Vary'), 'Precognition', ])))); } /** * Restore the original route dispatcher bindings. * * @param array|null $callableBinding * @param array|null $controllerBinding * @return void */ protected function restoreDispatchers($callableBinding, $controllerBinding) { if ($callableBinding) { $this->container->bind(CallableDispatcherContract::class, $callableBinding['concrete'], $callableBinding['shared']); } if ($controllerBinding) { $this->container->bind(ControllerDispatcherContract::class, $controllerBinding['concrete'], $controllerBinding['shared']); } } }