permissionRepository ??= new PermissionRepository(); } public function createRolePermissionRepository(): RolePermissionRepository { return $this->rolePermissionRepository ??= new RolePermissionRepository(); } public function createUserRoleRepository(): UserRoleRepository { return $this->userRoleRepository ??= new UserRoleRepository(); } public function createPermissionService(): PermissionService { return $this->permissionService ??= new PermissionService( $this->createPermissionRepository(), $this->createRolePermissionRepository(), $this->createUserRoleRepository() ); } public function createPermissionGateway(): PermissionGateway { return $this->permissionGateway ??= new PermissionGateway($this->createPermissionService()); } public function createUserAuthorizationPolicy(): UserAuthorizationPolicy { return $this->userAuthorizationPolicy ??= new UserAuthorizationPolicy( $this->createPermissionGateway(), $this->createDirectoryScopeGateway() ); } public function createRoleAuthorizationPolicy(): RoleAuthorizationPolicy { return $this->roleAuthorizationPolicy ??= new RoleAuthorizationPolicy( $this->createPermissionGateway() ); } public function createPermissionAuthorizationPolicy(): PermissionAuthorizationPolicy { return $this->permissionAuthorizationPolicy ??= new PermissionAuthorizationPolicy( $this->createPermissionGateway() ); } public function createSettingsAuthorizationPolicy(): SettingsAuthorizationPolicy { return $this->settingsAuthorizationPolicy ??= new SettingsAuthorizationPolicy( $this->createPermissionGateway() ); } public function createTenantAuthorizationPolicy(): TenantAuthorizationPolicy { return $this->tenantAuthorizationPolicy ??= new TenantAuthorizationPolicy( $this->createPermissionGateway(), $this->createDirectoryScopeGateway() ); } public function createDepartmentAuthorizationPolicy(): DepartmentAuthorizationPolicy { return $this->departmentAuthorizationPolicy ??= new DepartmentAuthorizationPolicy( $this->createPermissionGateway(), $this->createDirectoryScopeGateway() ); } public function createAuthorizationService(): AuthorizationService { return $this->authorizationService ??= new AuthorizationService([ $this->createUserAuthorizationPolicy(), $this->createRoleAuthorizationPolicy(), $this->createPermissionAuthorizationPolicy(), $this->createSettingsAuthorizationPolicy(), $this->createTenantAuthorizationPolicy(), $this->createDepartmentAuthorizationPolicy(), ]); } private function createDirectoryScopeGateway(): DirectoryScopeGateway { return $this->directoryScopeGateway ??= $this->directoryServicesFactory()->createDirectoryScopeGateway(); } private function directoryServicesFactory(): DirectoryServicesFactory { return $this->directoryServicesFactory ??= new DirectoryServicesFactory(); } }