Commit e5a0184d authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Nouveau listener Doctrine EntitySourceInjector : injecte automatiquement la...

Nouveau listener Doctrine EntitySourceInjector :  injecte automatiquement la source (resp. le source code) spécifiée dans la config dans toute entité implémentant SourceAwareInterface (resp. ImportAwareInterface). Code unique de la source à injecter spécifié par la clé de config ['unicaen-import']['entity_source_injector']['source_code'].
parent 8ea9c043
......@@ -3,6 +3,8 @@
namespace UnicaenImport;
use UnicaenAuth\Guard\PrivilegeController;
use UnicaenImport\ORM\Event\Listeners\EntitySourceInjector;
use UnicaenImport\ORM\Event\Listeners\EntitySourceInjectorFactory;
use UnicaenImport\ORM\Query\Functions\PasHistorise;
use UnicaenImport\Provider\Privilege\Privileges;
......@@ -143,6 +145,13 @@ return [
],
],
],
'eventmanager' => [
'orm_default' => [
'subscribers' => [
'UnicaenImport\EntitySourceInjector',
],
],
],
],
'service_manager' => [
......@@ -154,6 +163,7 @@ return [
],
'factories' => [
'UnicaenImport\Options\Module' => Options\ModuleOptionsFactory::class,
'UnicaenImport\EntitySourceInjector' => EntitySourceInjectorFactory::class,
],
],
......
......@@ -10,6 +10,14 @@ return [
'differentiel_view_helpers' => [
/* nom de la table (attention à la CASSE) => Nom de l'aide de vue (qui doit hériter de UnicaenImport\View\Helper\DifferentielLigne\DifferentielLigne) */
],
/**
* Injection automatique d'une Source dans les entités créées par l'appli.
*/
'entity_source_injector' => [
// Code unique de la source à injecter (null pour désactiver le mécanisme).
'source_code' => null,
],
],
'navigation' => [
......
<?php
namespace UnicaenImport\Entity\Db\Interfaces;
use UnicaenImport\Entity\Db\Source;
use UnicaenImport\Entity\Db\Source;
/**
* Interface des entités possédant une gestion de l'import
* Interface des entités possédant une gestion de l'import.
*
* @author Laurent LÉCLUSE <laurent.lecluse at unicaen.fr>
* @see Source
*/
interface ImportAwareInterface
{
public function setSource(Source $source = null);
/**
* @return Source
*/
public function getSource();
/**
* Set sourceCode
*
* @param string $sourceCode
*
* @return self
* @return $this
*/
public function setSourceCode($sourceCode);
/**
* Get sourceCode
*
* @return string
*/
public function getSourceCode();
......
<?php
namespace UnicaenImport\Entity\Db\Interfaces;
use UnicaenImport\Entity\Db\Source;
/**
* Interface des entités possédant une "source".
*
* @see Source
*/
interface SourceAwareInterface
{
/**
* @param Source $source
* @return $this
*/
public function setSource(Source $source = null);
/**
* @return Source
*/
public function getSource();
}
\ No newline at end of file
......@@ -12,7 +12,6 @@ use Doctrine\ORM\Mapping as ORM;
*/
class Source
{
/**
* @var string
* @ORM\Column(name="CODE", type="string", length=255, unique=true, nullable=false)
......@@ -39,8 +38,6 @@ class Source
*/
protected $id;
/**
* Set code
*
......@@ -55,8 +52,6 @@ class Source
return $this;
}
/**
* Get code
*
......@@ -67,8 +62,6 @@ class Source
return $this->code;
}
/**
* Set importable
*
......@@ -83,8 +76,6 @@ class Source
return $this;
}
/**
* Get importable
*
......@@ -95,8 +86,6 @@ class Source
return $this->importable;
}
/**
* Set libelle
*
......@@ -111,8 +100,6 @@ class Source
return $this;
}
/**
* Get libelle
*
......@@ -123,8 +110,6 @@ class Source
return $this->libelle;
}
/**
* Get id
*
......@@ -135,8 +120,6 @@ class Source
return $this->id;
}
/**
* Retourne la représentation littérale de cet objet.
*
......@@ -147,8 +130,6 @@ class Source
return $this->getLibelle();
}
/**
* @since PHP 5.6.0
* This method is called by var_dump() when dumping an object to get the properties that should be shown.
......@@ -163,4 +144,4 @@ class Source
'libelle' => $this->libelle,
];
}
}
}
\ No newline at end of file
......@@ -2,56 +2,17 @@
namespace UnicaenImport\Entity\Db\Traits;
use UnicaenImport\Entity\Db\Source;
/**
* Description of SourceAwareTrait
*
* @author UnicaenCode
*/
trait ImportAwareTrait
{
/**
* @var Source
*/
private $source;
use SourceAwareTrait;
/**
* @var string
*/
private $sourceCode;
/**
* @param Source $source
*
* @return self
*/
public function setSource(Source $source = null)
{
$this->source = $source;
return $this;
}
/**
* @return Source
*/
public function getSource()
{
return $this->source;
}
protected $sourceCode;
/**
* Set sourceCode
*
* @param string $sourceCode
*
* @return self
*/
public function setSourceCode($sourceCode)
......@@ -61,11 +22,7 @@ trait ImportAwareTrait
return $this;
}
/**
* Get sourceCode
*
* @return string
*/
public function getSourceCode()
......
......@@ -4,34 +4,24 @@ namespace UnicaenImport\Entity\Db\Traits;
use UnicaenImport\Entity\Db\Source;
/**
* Description of SourceAwareTrait
*
* @author UnicaenCode
*/
trait SourceAwareTrait
{
/**
* @var Source
*/
private $source;
protected $source;
/**
* @param Source $source
* @return self
*/
public function setSource( Source $source = null )
public function setSource(Source $source = null)
{
$this->source = $source;
return $this;
}
/**
* @return Source
*/
......
<?php
namespace UnicaenImport\ORM\Event\Listeners;
use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\Events;
use UnicaenImport\Entity\Db\Interfaces\ImportAwareInterface;
use UnicaenImport\Entity\Db\Interfaces\SourceAwareInterface;
use UnicaenImport\Entity\Db\Source;
/**
* Listener Doctrine.
*
* Injecte automatiquement la source (resp. le source code) spécifiée dans la config
* dans toute entité implémentant SourceAwareInterface (resp. ImportAwareInterface).
*
* @see SourceAwareInterface
* @see ImportAwareInterface
* @author Unicaen
*/
class EntitySourceInjector implements EventSubscriber
{
/**
* @var Source
*/
protected $sourceCode;
/**
* Spécifie le code (unique) de la source à injecter.
*
* @param string $sourceCode
* @return $this
*/
public function setSourceCode($sourceCode = null)
{
$this->sourceCode = $sourceCode;
return $this;
}
/**
* {@inheritdoc}
*/
public function getSubscribedEvents()
{
return [
Events::prePersist,
];
}
/**
* @param LifecycleEventArgs $args
*/
public function prePersist(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
// Pas la peine de continuer si on a pas de code de la source à injecter.
if ($this->sourceCode === null) {
return;
}
// L'entité doit implémenter l'interface SourceAwareInterface.
if (! $entity instanceof SourceAwareInterface) {
return;
}
// Si une source est déjà renseignée, rien à faire.
if ($entity->getSource() !== null) {
return;
}
// Injection de la source
/** @var Source $source */
$source = $args->getEntityManager()->getRepository(Source::class)->findOneBy([
'code' => $this->sourceCode
]);
$entity->setSource($source);
// Injection si possible et si besoin du "sourceCode"
if ($entity instanceof ImportAwareInterface && $entity->getSourceCode() === null) {
// le "sourceCode" par défaut de l'entité est son id
if (method_exists($entity, 'getId')) {
$entity->setSourceCode($entity->getId());
}
}
}
}
\ No newline at end of file
<?php
namespace UnicaenImport\ORM\Event\Listeners;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
final class EntitySourceInjectorFactory implements FactoryInterface
{
/**
* Create service
*
* @param ServiceLocatorInterface $serviceLocator
* @return EntitySourceInjector
*/
public function createService(ServiceLocatorInterface $serviceLocator)
{
$sourceCode = $this->getDefaultSourceCode($serviceLocator);
$service = new EntitySourceInjector();
$service->setSourceCode($sourceCode);
return $service;
}
private function getDefaultSourceCode(ServiceLocatorInterface $serviceLocator)
{
$config = $serviceLocator->get('Config');
if (! isset($config['unicaen-import']['entity_source_injector']['source_code'])) {
return null;
}
return $config['unicaen-import']['entity_source_injector']['source_code'];
}
}
\ No newline at end of file
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment