Optimized LayerRepositoryFactoryService

This commit is contained in:
Kevin Frantz 2019-01-20 13:33:33 +01:00
parent 86198ff2df
commit 5301be7614
12 changed files with 123 additions and 63 deletions

View File

@ -1,36 +0,0 @@
<?php
namespace App\Domain\CRUDManagement;
use App\Entity\EntityInterface;
use App\Repository\RepositoryInterface;
use Doctrine\ORM\EntityManagerInterface;
/**
* @author kevinfrantz
*/
final class RepositoryFactoryService implements RepositoryFactoryServiceInterface
{
/**
* @var EntityManagerInterface
*/
private $entityManager;
/**
* @param EntityManagerInterface $entityManager
*/
private function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
/**
* {@inheritdoc}
*
* @see \App\Domain\CRUDManagement\RepositoryFactoryInterface::getRepository()
*/
public function getRepository(EntityInterface $entity): RepositoryInterface
{
$this->entityManager->getRepository(get_class($entity));
}
}

View File

@ -1,21 +0,0 @@
<?php
namespace App\Domain\CRUDManagement;
use App\Repository\RepositoryInterface;
use App\Entity\EntityInterface;
/**
* Offers a fabric for entity repositories.
*
* @author kevinfrantz
*/
interface RepositoryFactoryServiceInterface
{
/**
* @param EntityInterface $entity
*
* @return RepositoryInterface The repositoy of the interface
*/
public function getRepository(EntityInterface $entity): RepositoryInterface;
}

View File

@ -9,9 +9,9 @@ A folder MUST end on the suffix ** *Management ** to show that it has the purpos
# Domain Overview
## CRUD Management
### Repository Factory Service
Offers a fabric for entity repositories.
## Repository Management
### Layer Repository Factory Service
Offers a fabric to produce entity repositories by layer
## Entity Management
### Entity Meta Information ###
Offers some meta information about an entity

View File

@ -0,0 +1,60 @@
<?php
namespace App\Domain\RepositoryManagement;
use App\Repository\RepositoryInterface;
use Doctrine\ORM\EntityManagerInterface;
use App\DBAL\Types\Meta\Right\LayerType;
use App\Exception\NotSetException;
use App\Entity\Source\AbstractSource;
/**
* @author kevinfrantz
*/
final class LayerRepositoryFactoryService implements LayerRepositoryFactoryServiceInterface
{
const LAYER_CLASS_MAP = [
LayerType::SOURCE => AbstractSource::class,
];
/**
* @var EntityManagerInterface
*/
private $entityManager;
/**
* @param string $layer
*
* @throws NotSetException
*
* @return string
*/
private function getRepositoryClassName(string $layer): string
{
$map = self::LAYER_CLASS_MAP;
if (array_key_exists($layer, $map)) {
return $map[$layer];
}
throw new NotSetException('The requested layer is not mapped!');
}
/**
* @param EntityManagerInterface $entityManager
*/
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
/**
* @param string $layer
*
* @return RepositoryInterface
*/
public function getRepository(string $layer): RepositoryInterface
{
$repositoryClassName = $this->getRepositoryClassName($layer);
return $this->entityManager->getRepository($repositoryClassName);
}
}

View File

@ -0,0 +1,20 @@
<?php
namespace App\Domain\RepositoryManagement;
use App\Repository\RepositoryInterface;
/**
* Offers a fabric to produce entity repositories by layer.
*
* @author kevinfrantz
*/
interface LayerRepositoryFactoryServiceInterface
{
/**
* @param string $layer
*
* @return RepositoryInterface
*/
public function getRepository(string $layer): RepositoryInterface;
}

View File

@ -10,6 +10,7 @@ use App\Domain\RequestManagement\Right\RequestedRightInterface;
/**
* @author kevinfrantz
*
* @todo Implement!
*/
class RequestedAction extends RequestedUser implements RequestedActionInterface

View File

@ -9,6 +9,7 @@ use App\Domain\RequestManagement\User\RequestedUserInterface;
* An action containes multiple attributes which are neccessary to process a request.
*
* @see ActionType
*
* @author kevinfrantz
*/
interface RequestedActionInterface extends ActionTypeAttributInterface, RequestedUserInterface

View File

@ -4,7 +4,9 @@ namespace App\Domain\RequestManagement\Action;
/**
* Allows to use a action as a service.
*
* @todo Implement!
*
* @author kevinfrantz
*/
interface RequestedActionServiceInterface

View File

@ -45,7 +45,7 @@ abstract class AbstractEntity implements EntityInterface
* @var string
*/
protected $slug;
public function __construct()
{
$this->version = 0;

View File

@ -9,6 +9,6 @@ use App\Entity\Attribut\SlugAttributInterface;
/**
* @author kevinfrantz
*/
interface EntityInterface extends VersionAttributInterface, IdAttributInterface,SlugAttributInterface
interface EntityInterface extends VersionAttributInterface, IdAttributInterface, SlugAttributInterface
{
}

View File

@ -9,7 +9,6 @@ use App\Entity\Attribut\LawAttribut;
use App\Entity\Meta\LawInterface;
use App\Entity\Meta\Law;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Validator\Constraints as Assert;
use App\Entity\Attribut\CreatorRelationAttribut;
use App\Entity\Meta\Relation\Parent\CreatorRelationInterface;
use App\Entity\Meta\Relation\Parent\CreatorRelation;

View File

@ -0,0 +1,34 @@
<?php
namespace tests\Unit\Domain\RepositoryManagement;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use App\Domain\RepositoryManagement\LayerRepositoryFactoryServiceInterface;
use App\Domain\RepositoryManagement\LayerRepositoryFactoryService;
use App\Repository\RepositoryInterface;
/**
* @author kevinfrantz
*/
class LayerRepositoryFactoryServiceTest extends KernelTestCase
{
/**
* @var LayerRepositoryFactoryServiceInterface
*/
private $layerRepositoryFactoryService;
public function setUp(): void
{
self::bootKernel();
$entityManager = self::$container->get('doctrine')->getManager();
$this->layerRepositoryFactoryService = new LayerRepositoryFactoryService($entityManager);
}
public function testGetRepository(): void
{
foreach (LayerRepositoryFactoryService::LAYER_CLASS_MAP as $layer => $class) {
$repositoy = $this->layerRepositoryFactoryService->getRepository($layer);
$this->assertInstanceOf(RepositoryInterface::class, $repositoy);
}
}
}