Implemented LazyLoading for RequestedEntity

This commit is contained in:
Kevin Frantz 2019-02-17 22:50:42 +01:00
parent 271aa36552
commit ac24ab950d

View File

@ -1,5 +1,4 @@
<?php <?php
namespace Infinito\Domain\RequestManagement\Entity; namespace Infinito\Domain\RequestManagement\Entity;
use Infinito\Entity\AbstractEntity; use Infinito\Entity\AbstractEntity;
@ -18,9 +17,12 @@ use Infinito\Attribut\ClassAttribut;
use Infinito\Exception\AllreadyDefinedException; use Infinito\Exception\AllreadyDefinedException;
use Infinito\Domain\RequestManagement\Right\RequestedRightInterface; use Infinito\Domain\RequestManagement\Right\RequestedRightInterface;
use Infinito\Domain\RepositoryManagement\LayerRepositoryFactoryService; use Infinito\Domain\RepositoryManagement\LayerRepositoryFactoryService;
use Infinito\Attribut\SlugAttributInterface;
/** /**
*
* @author kevinfrantz * @author kevinfrantz
* @todo Move lazy load to an own child class
*/ */
class RequestedEntity extends AbstractEntity implements RequestedEntityInterface class RequestedEntity extends AbstractEntity implements RequestedEntityInterface
{ {
@ -28,6 +30,12 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface
RequestedRightAttribut, RequestedRightAttribut,
ClassAttribut{ setClass as private setClassTrait; getClass as private getClassTrait; } ClassAttribut{ setClass as private setClassTrait; getClass as private getClassTrait; }
/**
*
* @var EntityInterface|NULL Important for lazy loading
*/
private static $lazyLoadedEntity;
/** /**
* BE AWARE: * BE AWARE:
* This attribut can lead to sideeffects, because it can be defined, or NULL. * 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; private $layerRepositoryFactoryService;
/** /**
*
* @throws NotSetException * @throws NotSetException
*/ */
private function validateHasIdentity(): void 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!'); throw new NotSetException('No identity attribut like id or slug was set!');
} }
} }
/** /**
*
* @param EntityInterface|null $entity * @param EntityInterface|null $entity
* *
* @throws NotFoundHttpException * @throws NotFoundHttpException
*/ */
private function validateLoadedEntity(?EntityInterface $entity): void private function validateLoadedEntity(?EntityInterface $entity): void
{ {
if (!$entity) { if (! $entity) {
throw new NotFoundHttpException('Entity with {id:"'.$this->id.'",slug:"'.$this->slug.'"} not found'); 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 * @return EntityInterface|SourceInterface|null
*/ */
private function loadEntityBySlugOrId(): ?EntityInterface 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 * @throws NotCorrectInstanceException
* *
* @return SourceInterface|null * @return SourceInterface|null
@ -81,10 +125,11 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface
if ($repository instanceof SourceRepositoryInterface) { if ($repository instanceof SourceRepositoryInterface) {
return $repository->findOneBySlug($this->slug); 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 * @return EntityInterface|null
*/ */
private function loadById(): ?EntityInterface private function loadById(): ?EntityInterface
@ -95,16 +140,18 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface
} }
/** /**
*
* @throws NotFoundHttpException * @throws NotFoundHttpException
*/ */
private function validateLayerRepositoryFactoryService(): void private function validateLayerRepositoryFactoryService(): void
{ {
if (!$this->layerRepositoryFactoryService) { if (! $this->layerRepositoryFactoryService) {
throw new NotSetException('The operation is not possible, because the class '.LayerRepositoryFactoryService::class.' is not injected!'); throw new NotSetException('The operation is not possible, because the class ' . LayerRepositoryFactoryService::class . ' is not injected!');
} }
} }
/** /**
*
* @return RepositoryInterface * @return RepositoryInterface
*/ */
private function getEntityRepository(): RepositoryInterface private function getEntityRepository(): RepositoryInterface
@ -117,6 +164,7 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface
} }
/** /**
*
* @param LayerRepositoryFactoryServiceInterface|null $layerRepositoryFactoryService * @param LayerRepositoryFactoryServiceInterface|null $layerRepositoryFactoryService
*/ */
public function __construct(?LayerRepositoryFactoryServiceInterface $layerRepositoryFactoryService = null) public function __construct(?LayerRepositoryFactoryServiceInterface $layerRepositoryFactoryService = null)
@ -125,6 +173,7 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface
} }
/** /**
*
* {@inheritdoc} * {@inheritdoc}
* *
* @see \Infinito\Domain\RequestManagement\Entity\RequestedEntityInterface::hasIdentity() * @see \Infinito\Domain\RequestManagement\Entity\RequestedEntityInterface::hasIdentity()
@ -135,6 +184,7 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface
} }
/** /**
*
* {@inheritdoc} * {@inheritdoc}
* *
* @see \Infinito\Domain\RequestManagement\Entity\RequestedEntityInterface::setIdentity() * @see \Infinito\Domain\RequestManagement\Entity\RequestedEntityInterface::setIdentity()
@ -155,6 +205,7 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface
} }
/** /**
*
* {@inheritdoc} * {@inheritdoc}
* *
* @see \Infinito\Attribut\ClassAttributInterface::setClass() * @see \Infinito\Attribut\ClassAttributInterface::setClass()
@ -168,6 +219,7 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface
} }
/** /**
*
* {@inheritdoc} * {@inheritdoc}
* *
* @see \Infinito\Domain\RequestManagement\Entity\RequestedEntityInterface::getEntity() * @see \Infinito\Domain\RequestManagement\Entity\RequestedEntityInterface::getEntity()
@ -176,6 +228,7 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface
{ {
$this->validateHasIdentity(); $this->validateHasIdentity();
$entity = $this->loadEntityBySlugOrId(); $entity = $this->loadEntityBySlugOrId();
//$entity = $this->lazyLoadEntity();
$this->validateLoadedEntity($entity); $this->validateLoadedEntity($entity);
return $entity; return $entity;
@ -191,12 +244,13 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface
public function setRequestedRight(RequestedRightInterface $requestedRight): void public function setRequestedRight(RequestedRightInterface $requestedRight): void
{ {
$this->requestedRight = $requestedRight; $this->requestedRight = $requestedRight;
if (!$this->requestedRight->hasRequestedEntity()) { if (! $this->requestedRight->hasRequestedEntity()) {
$this->requestedRight->setRequestedEntity($this); $this->requestedRight->setRequestedEntity($this);
} }
} }
/** /**
*
* {@inheritdoc} * {@inheritdoc}
* *
* @see \Infinito\Attribut\ClassAttributInterface::getClass() * @see \Infinito\Attribut\ClassAttributInterface::getClass()