apiKeyService = $apiKeyService; $this->routesWhitelist = $routesWhitelist; } public function process(Request $request, RequestHandlerInterface $handler): Response { /** @var RouteResult|null $routeResult */ $routeResult = $request->getAttribute(RouteResult::class); if ( $routeResult === null || $routeResult->isFailure() || $request->getMethod() === self::METHOD_OPTIONS || contains($this->routesWhitelist, $routeResult->getMatchedRouteName()) ) { return $handler->handle($request); } $apiKey = $request->getHeaderLine(self::API_KEY_HEADER); if (empty($apiKey)) { throw MissingAuthenticationException::fromExpectedTypes([self::API_KEY_HEADER]); } $result = $this->apiKeyService->check($apiKey); if (! $result->isValid()) { throw VerifyAuthenticationException::forInvalidApiKey(); } return $handler->handle($request->withAttribute(ApiKey::class, $result->apiKey())); } public static function apiKeyFromRequest(Request $request): ApiKey { return $request->getAttribute(ApiKey::class); } }