mirror of
https://github.com/kevinveenbirkenbach/infinito.git
synced 2024-12-04 23:17:19 +01:00
Implemented LazyLoading for RequestedEntity
This commit is contained in:
parent
271aa36552
commit
ac24ab950d
@ -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()
|
||||
|
Loading…
Reference in New Issue
Block a user