Implemented class LazyRequestedEntity

This commit is contained in:
Kevin Frantz 2019-02-17 23:17:53 +01:00
parent ac24ab950d
commit 8b7b3bc44e
3 changed files with 82 additions and 64 deletions

View File

@ -0,0 +1,62 @@
<?php
namespace Infinito\Domain\RequestManagement\Entity;
use Infinito\Entity\EntityInterface;
use Infinito\Attribut\SlugAttributInterface;
/**
* This class allows to use the RequestedEntity via LazyLoading
* It reduce the ammount of requests which are send to the database.
*
* @author kevinfrantz
*/
class LazyRequestedEntity extends RequestedEntity
{
/**
* @var EntityInterface|null Important for lazy loading
*/
private static $lazyLoadedEntity;
/**
* {@inheritdoc}
*
* @see \Infinito\Domain\RequestManagement\Entity\RequestedEntity::loadEntity()
*/
protected function loadEntity(): ?EntityInterface
{
return $this->lazyLoadEntity();
}
/**
* @return EntityInterface|null
*/
private function lazyLoadEntity(): ?EntityInterface
{
if ($this->isLazyLoadNeccessary()) {
$entity = parent::loadEntity();
self::$lazyLoadedEntity = $entity;
}
return self::$lazyLoadedEntity;
}
/**
* @return bool
*/
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;
}
}

View File

@ -1,4 +1,5 @@
<?php
namespace Infinito\Domain\RequestManagement\Entity;
use Infinito\Entity\AbstractEntity;
@ -17,11 +18,10 @@ 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
@ -30,12 +30,6 @@ 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.
@ -45,7 +39,6 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface
private $layerRepositoryFactoryService;
/**
*
* @throws NotSetException
*/
private function validateHasIdentity(): void
@ -56,7 +49,6 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface
}
/**
*
* @param EntityInterface|null $entity
*
* @throws NotFoundHttpException
@ -69,20 +61,6 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface
}
/**
*
* @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
@ -95,26 +73,6 @@ 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
@ -129,7 +87,6 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface
}
/**
*
* @return EntityInterface|null
*/
private function loadById(): ?EntityInterface
@ -140,7 +97,6 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface
}
/**
*
* @throws NotFoundHttpException
*/
private function validateLayerRepositoryFactoryService(): void
@ -151,7 +107,6 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface
}
/**
*
* @return RepositoryInterface
*/
private function getEntityRepository(): RepositoryInterface
@ -164,7 +119,14 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface
}
/**
*
* @return EntityInterface|null
*/
protected function loadEntity(): ?EntityInterface
{
return $this->loadEntityBySlugOrId();
}
/**
* @param LayerRepositoryFactoryServiceInterface|null $layerRepositoryFactoryService
*/
public function __construct(?LayerRepositoryFactoryServiceInterface $layerRepositoryFactoryService = null)
@ -173,7 +135,6 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface
}
/**
*
* {@inheritdoc}
*
* @see \Infinito\Domain\RequestManagement\Entity\RequestedEntityInterface::hasIdentity()
@ -184,7 +145,6 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface
}
/**
*
* {@inheritdoc}
*
* @see \Infinito\Domain\RequestManagement\Entity\RequestedEntityInterface::setIdentity()
@ -205,7 +165,6 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface
}
/**
*
* {@inheritdoc}
*
* @see \Infinito\Attribut\ClassAttributInterface::setClass()
@ -219,16 +178,14 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface
}
/**
*
* {@inheritdoc}
*
* @see \Infinito\Domain\RequestManagement\Entity\RequestedEntityInterface::getEntity()
*/
public function getEntity(): EntityInterface
final public function getEntity(): EntityInterface
{
$this->validateHasIdentity();
$entity = $this->loadEntityBySlugOrId();
//$entity = $this->lazyLoadEntity();
$entity = $this->loadEntity();
$this->validateLoadedEntity($entity);
return $entity;
@ -250,7 +207,6 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface
}
/**
*
* {@inheritdoc}
*
* @see \Infinito\Attribut\ClassAttributInterface::getClass()

View File

@ -7,7 +7,7 @@ use Infinito\Domain\RepositoryManagement\LayerRepositoryFactoryServiceInterface;
/**
* @author kevinfrantz
*/
final class RequestedEntityService extends RequestedEntity implements RequestedEntityServiceInterface
class RequestedEntityService extends LazyRequestedEntity implements RequestedEntityServiceInterface
{
/**
* @param LayerRepositoryFactoryServiceInterface $layerRepositoryFactoryService