configBuilder = $configBuilder; $this->authenticatorFactory = $authenticatorFactory; $this->logger = new NullLogger(); } public function setLogger(LoggerInterface $logger): void { $this->logger = $logger; } public function getEvents(): array { return [ 'before' => ['loginIfRequired'], 'complete' => ['loginIfRequested'], ]; } public function loginIfRequired(BeforeEvent $event) { $config = $this->buildSiteConfig($event->getRequest()); if (false === $config || !$config->requiresLogin()) { $this->logger->debug('loginIfRequired> will not require login'); return; } $client = $event->getClient(); $authenticator = $this->authenticatorFactory->buildFromSiteConfig($config); if (!$authenticator->isLoggedIn($client)) { $this->logger->debug('loginIfRequired> user is not logged in, attach authenticator'); $emitter = $client->getEmitter(); $emitter->detach($this); $authenticator->login($client); $emitter->attach($this); } } public function loginIfRequested(CompleteEvent $event) { $config = $this->buildSiteConfig($event->getRequest()); if (false === $config || !$config->requiresLogin()) { $this->logger->debug('loginIfRequested> will not require login'); return; } $body = $event->getResponse()->getBody(); if ( null === $body || '' === $body->getContents() ) { $this->logger->debug('loginIfRequested> empty body, ignoring'); return; } $authenticator = $this->authenticatorFactory->buildFromSiteConfig($config); $isLoginRequired = $authenticator->isLoginRequired($body); $this->logger->debug('loginIfRequested> retry #' . self::$retries . ' with login ' . ($isLoginRequired ? '' : 'not ') . 'required'); if ($isLoginRequired && self::$retries < self::MAX_RETRIES) { $client = $event->getClient(); $emitter = $client->getEmitter(); $emitter->detach($this); $authenticator->login($client); $emitter->attach($this); $event->retry(); ++self::$retries; } } /** * @return SiteConfig|false */ private function buildSiteConfig(RequestInterface $request) { return $this->configBuilder->buildForHost($request->getHost()); } }