metadata = $metadata; $this->injectableFactory = $injectableFactory; } public function processBeforeLogin(AuthenticationData $data, Request $request): void { foreach ($this->getBeforeLoginHookList() as $hook) { $hook->process($data, $request); } } public function processOnFail(Result $result, AuthenticationData $data, Request $request): void { foreach ($this->getOnFailHookList() as $hook) { $hook->process($result, $data, $request); } } public function processOnSuccess(Result $result, AuthenticationData $data, Request $request): void { foreach ($this->getOnSuccessHookList() as $hook) { $hook->process($result, $data, $request); } } public function processOnSuccessByToken(Result $result, AuthenticationData $data, Request $request): void { foreach ($this->getOnSuccessByTokenHookList() as $hook) { $hook->process($result, $data, $request); } } public function processOnSecondStepRequired(Result $result, AuthenticationData $data, Request $request): void { foreach ($this->getOnSecondStepRequiredHookList() as $hook) { $hook->process($result, $data, $request); } } /** * @return class-string[] */ private function getHookClassNameList(string $type): array { $key = $type . 'HookClassNameList'; /** @var class-string[] */ return $this->metadata->get(['app', 'authentication', $key]) ?? []; } /** * @return BeforeLogin[] */ private function getBeforeLoginHookList(): array { $list = []; foreach ($this->getHookClassNameList('beforeLogin') as $className) { /** @var class-string $className */ $list[] = $this->injectableFactory->create($className); } return $list; } /** * @return OnResult[] */ private function getOnFailHookList(): array { $list = []; foreach ($this->getHookClassNameList('onFail') as $className) { /** @var class-string $className */ $list[] = $this->injectableFactory->create($className); } return $list; } /** * @return OnResult[] */ private function getOnSuccessHookList(): array { $list = []; foreach ($this->getHookClassNameList('onSuccess') as $className) { /** @var class-string $className */ $list[] = $this->injectableFactory->create($className); } return $list; } /** * @return OnResult[] */ private function getOnSuccessByTokenHookList(): array { $list = []; foreach ($this->getHookClassNameList('onSuccessByToken') as $className) { /** @var class-string $className */ $list[] = $this->injectableFactory->create($className); } return $list; } /** * @return OnResult[] */ private function getOnSecondStepRequiredHookList(): array { $list = []; foreach ($this->getHookClassNameList('onSecondStepRequired') as $className) { /** @var class-string $className */ $list[] = $this->injectableFactory->create($className); } return $list; } }