mirror of
				https://github.com/kevinveenbirkenbach/infinito.git
				synced 2025-10-31 09:19:08 +00:00 
			
		
		
		
	Implemented LazyLoading for RequestedEntity
This commit is contained in:
		| @@ -1,5 +1,4 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Infinito\Domain\RequestManagement\Entity; | ||||
|  | ||||
| use Infinito\Entity\AbstractEntity; | ||||
| @@ -18,9 +17,12 @@ use Infinito\Attribut\ClassAttribut; | ||||
| use Infinito\Exception\AllreadyDefinedException; | ||||
| use Infinito\Domain\RequestManagement\Right\RequestedRightInterface; | ||||
| use Infinito\Domain\RepositoryManagement\LayerRepositoryFactoryService; | ||||
| use Infinito\Attribut\SlugAttributInterface; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @author kevinfrantz | ||||
|  * @todo Move lazy load to an own child class | ||||
|  */ | ||||
| class RequestedEntity extends AbstractEntity implements RequestedEntityInterface | ||||
| { | ||||
| @@ -28,6 +30,12 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface | ||||
|     RequestedRightAttribut, | ||||
|     ClassAttribut{ setClass as private setClassTrait; getClass as private getClassTrait; } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @var EntityInterface|NULL Important for lazy loading | ||||
|      */ | ||||
|     private static $lazyLoadedEntity; | ||||
|  | ||||
|     /** | ||||
|      * BE AWARE: | ||||
|      * This attribut can lead to sideeffects, because it can be defined, or NULL. | ||||
| @@ -37,28 +45,44 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface | ||||
|     private $layerRepositoryFactoryService; | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @throws NotSetException | ||||
|      */ | ||||
|     private function validateHasIdentity(): void | ||||
|     { | ||||
|         if (!($this->hasId() || $this->hasSlug())) { | ||||
|         if (! ($this->hasId() || $this->hasSlug())) { | ||||
|             throw new NotSetException('No identity attribut like id or slug was set!'); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @param EntityInterface|null $entity | ||||
|      * | ||||
|      * @throws NotFoundHttpException | ||||
|      */ | ||||
|     private function validateLoadedEntity(?EntityInterface $entity): void | ||||
|     { | ||||
|         if (!$entity) { | ||||
|             throw new NotFoundHttpException('Entity with {id:"'.$this->id.'",slug:"'.$this->slug.'"} not found'); | ||||
|         if (! $entity) { | ||||
|             throw new NotFoundHttpException('Entity with {id:"' . $this->id . '",slug:"' . $this->slug . '"} not found'); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @return EntityInterface The lazy loaded entity | ||||
|      */ | ||||
|     private function lazyLoadEntity(): ?EntityInterface | ||||
|     { | ||||
|         if ($this->isLazyLoadNeccessary()) { | ||||
|             $entity = $this->loadEntityBySlugOrId(); | ||||
|             self::$lazyLoadedEntity = $entity; | ||||
|         } | ||||
|         return self::$lazyLoadedEntity; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @return EntityInterface|SourceInterface|null | ||||
|      */ | ||||
|     private function loadEntityBySlugOrId(): ?EntityInterface | ||||
| @@ -71,6 +95,26 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @return bool True if a reload is neccessary | ||||
|      */ | ||||
|     private function isLazyLoadNeccessary(): bool | ||||
|     { | ||||
|         if (self::$lazyLoadedEntity) { | ||||
|             if ($this->hasId()) { | ||||
|                 return $this->id !== self::$lazyLoadedEntity->getId(); | ||||
|             } | ||||
|             if ($this->hasSlug()) { | ||||
|                 if (self::$lazyLoadedEntity instanceof SlugAttributInterface) { | ||||
|                     return $this->slug !== self::$lazyLoadedEntity->getSlug(); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @throws NotCorrectInstanceException | ||||
|      * | ||||
|      * @return SourceInterface|null | ||||
| @@ -81,10 +125,11 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface | ||||
|         if ($repository instanceof SourceRepositoryInterface) { | ||||
|             return $repository->findOneBySlug($this->slug); | ||||
|         } | ||||
|         throw new NotCorrectInstanceException('To read an entity by slug is just allowed for entitys of type '.AbstractSource::class); | ||||
|         throw new NotCorrectInstanceException('To read an entity by slug is just allowed for entitys of type ' . AbstractSource::class); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @return EntityInterface|null | ||||
|      */ | ||||
|     private function loadById(): ?EntityInterface | ||||
| @@ -95,16 +140,18 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @throws NotFoundHttpException | ||||
|      */ | ||||
|     private function validateLayerRepositoryFactoryService(): void | ||||
|     { | ||||
|         if (!$this->layerRepositoryFactoryService) { | ||||
|             throw new NotSetException('The operation is not possible, because the class '.LayerRepositoryFactoryService::class.' is not injected!'); | ||||
|         if (! $this->layerRepositoryFactoryService) { | ||||
|             throw new NotSetException('The operation is not possible, because the class ' . LayerRepositoryFactoryService::class . ' is not injected!'); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @return RepositoryInterface | ||||
|      */ | ||||
|     private function getEntityRepository(): RepositoryInterface | ||||
| @@ -117,6 +164,7 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @param LayerRepositoryFactoryServiceInterface|null $layerRepositoryFactoryService | ||||
|      */ | ||||
|     public function __construct(?LayerRepositoryFactoryServiceInterface $layerRepositoryFactoryService = null) | ||||
| @@ -125,6 +173,7 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * {@inheritdoc} | ||||
|      * | ||||
|      * @see \Infinito\Domain\RequestManagement\Entity\RequestedEntityInterface::hasIdentity() | ||||
| @@ -135,6 +184,7 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * {@inheritdoc} | ||||
|      * | ||||
|      * @see \Infinito\Domain\RequestManagement\Entity\RequestedEntityInterface::setIdentity() | ||||
| @@ -155,6 +205,7 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * {@inheritdoc} | ||||
|      * | ||||
|      * @see \Infinito\Attribut\ClassAttributInterface::setClass() | ||||
| @@ -168,6 +219,7 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * {@inheritdoc} | ||||
|      * | ||||
|      * @see \Infinito\Domain\RequestManagement\Entity\RequestedEntityInterface::getEntity() | ||||
| @@ -176,6 +228,7 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface | ||||
|     { | ||||
|         $this->validateHasIdentity(); | ||||
|         $entity = $this->loadEntityBySlugOrId(); | ||||
|         //$entity = $this->lazyLoadEntity(); | ||||
|         $this->validateLoadedEntity($entity); | ||||
|  | ||||
|         return $entity; | ||||
| @@ -191,12 +244,13 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface | ||||
|     public function setRequestedRight(RequestedRightInterface $requestedRight): void | ||||
|     { | ||||
|         $this->requestedRight = $requestedRight; | ||||
|         if (!$this->requestedRight->hasRequestedEntity()) { | ||||
|         if (! $this->requestedRight->hasRequestedEntity()) { | ||||
|             $this->requestedRight->setRequestedEntity($this); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * {@inheritdoc} | ||||
|      * | ||||
|      * @see \Infinito\Attribut\ClassAttributInterface::getClass() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user