From 2dca4963d882e9e9ea590a34ed22de3b6d922941 Mon Sep 17 00:00:00 2001
From: David Surville <david.surville@unicaen.fr>
Date: Thu, 23 May 2019 15:04:14 +0200
Subject: [PATCH] Ajout d'une interface et d'un trait pour chaque service et
 utilisation dans les factories

---
 src/UnicaenLdap/Entity/Group.php              |  6 +--
 src/UnicaenLdap/Entity/People.php             | 49 ++++++-------------
 src/UnicaenLdap/Service/AbstractService.php   | 44 +++++------------
 src/UnicaenLdap/Service/GenericFactory.php    | 42 ++++++++++------
 src/UnicaenLdap/Service/GroupFactory.php      | 42 ++++++++++------
 .../LdapGenericServiceAwareInterface.php      | 19 +++++++
 .../Service/LdapGenericServiceAwareTrait.php  | 29 +++++++++++
 .../LdapGroupServiceAwareInterface.php        | 19 +++++++
 .../Service/LdapGroupServiceAwareTrait.php    | 29 +++++++++++
 .../LdapPeopleServiceAwareInterface.php       | 11 ++++-
 .../Service/LdapPeopleServiceAwareTrait.php   |  8 +++
 .../LdapStructureServiceAwareInterface.php    | 19 +++++++
 .../LdapStructureServiceAwareTrait.php        | 29 +++++++++++
 .../LdapSystemServiceAwareInterface.php       | 19 +++++++
 .../Service/LdapSystemServiceAwareTrait.php   | 29 +++++++++++
 src/UnicaenLdap/Service/PeopleFactory.php     | 37 +++++++++-----
 src/UnicaenLdap/Service/StructureFactory.php  | 37 +++++++++-----
 src/UnicaenLdap/Service/SystemFactory.php     | 37 +++++++++-----
 18 files changed, 371 insertions(+), 134 deletions(-)
 create mode 100644 src/UnicaenLdap/Service/LdapGenericServiceAwareInterface.php
 create mode 100644 src/UnicaenLdap/Service/LdapGenericServiceAwareTrait.php
 create mode 100644 src/UnicaenLdap/Service/LdapGroupServiceAwareInterface.php
 create mode 100644 src/UnicaenLdap/Service/LdapGroupServiceAwareTrait.php
 create mode 100644 src/UnicaenLdap/Service/LdapStructureServiceAwareInterface.php
 create mode 100644 src/UnicaenLdap/Service/LdapStructureServiceAwareTrait.php
 create mode 100644 src/UnicaenLdap/Service/LdapSystemServiceAwareInterface.php
 create mode 100644 src/UnicaenLdap/Service/LdapSystemServiceAwareTrait.php

diff --git a/src/UnicaenLdap/Entity/Group.php b/src/UnicaenLdap/Entity/Group.php
index 23a68d0..84dccb2 100644
--- a/src/UnicaenLdap/Entity/Group.php
+++ b/src/UnicaenLdap/Entity/Group.php
@@ -67,11 +67,11 @@ class Group extends Entity
      */
     public function getPeople($orderBy = null)
     {
-        /* @var $people \UnicaenLdap\Service\People */
-        $people = $this->getService()->getLdapServiceForEntityClass(\UnicaenLdap\Service\People::class);
+        /* @var $peopleService \UnicaenLdap\Service\People */
+        $peopleService = $this->getService()->getLdapPeopleService();
 
         /** @var People[] $result */
-        $result = $people->getAllBy($this->get('member'), 'dn', $orderBy);
+        $result = $peopleService->getAllBy($this->get('member'), 'dn', $orderBy);
 
         return $result;
     }
diff --git a/src/UnicaenLdap/Entity/People.php b/src/UnicaenLdap/Entity/People.php
index a7f36aa..d647ee7 100644
--- a/src/UnicaenLdap/Entity/People.php
+++ b/src/UnicaenLdap/Entity/People.php
@@ -133,9 +133,9 @@ class People extends Entity
      */
     public function getGroups(DateTime $dateObservation = null, $orderBy = null)
     {
-        $group = $this->getService()->getLdapServiceForEntityClass(\UnicaenLdap\Service\Group::class);
+        $groupService = $this->getService()->getLdapGroupService();
 
-        return $group->filterValids($group->getAllBy($this->get('memberOf'), 'dn', $orderBy), $dateObservation);
+        return $groupService->filterValids($groupService->getAllBy($this->get('memberOf'), 'dn', $orderBy), $dateObservation);
     }
 
     /**
@@ -168,67 +168,50 @@ class People extends Entity
         return 0 === strpos($this->uid, 'i');
     }
 
-    /**
-     * @var \UnicaenLdap\Service\Structure
-     */
-    protected $ldapStructureService;
-
-    /**
-     * @return \UnicaenLdap\Service\Structure
-     */
-    protected function getLdapStructureService()
-    {
-        if (null === $this->ldapStructureService) {
-            $this->ldapStructureService =
-                $this->getService()->getLdapServiceForEntityClass(\UnicaenLdap\Service\Structure::class);
-        }
-
-        return $this->ldapStructureService;
-    }
-
     /**
      * Retourne les structures auxquelles appartiennent la personne
      *
-     * @return Structure[]
+     * @return Entity[]|Structure[]
      */
     public function getEduPersonOrgUnit()
     {
-        $structure = $this->getLdapStructureService();
+        $structureService = $this->getService()->getLdapStructureService();
         $dn = $this->eduPersonOrgUnitDN;
         if (empty($dn)) return null;
 
-        return $structure->getAllBy($dn, 'dn');
+        return $structureService->getAllBy($dn, 'dn');
     }
 
     /**
      * Retourne la structure principale à laquelle appartient la personne
      *
-     * @return Structure
+     * @return Entity|Structure
+     * @throws \UnicaenLdap\Exception
      */
     public function getEduPersonPrimaryOrgUnit()
     {
-        $structure = $this->getLdapStructureService();
+        $structureService = $this->getService()->getLdapStructureService();
         $dn = $this->eduPersonPrimaryOrgUnitDN;
         if (empty($dn)) return null;
 
-        return $structure->getBy($dn, 'dn');
+        return $structureService->getBy($dn, 'dn');
     }
 
     /**
      * Retourne la structure d'affectation de la personne
      *
      * @todo à terminer
-     * @return Structure[]
+     * @return Entity|Structure
      * @throws \Exception
      */
     public function getEntiteAffectation()
     {
         throw new \Exception('Méthode pas finie');
-        $structure = $this->getLdapStructureService();
+        $structureService = $this->getService()->getLdapStructureService();
         $codes = $this->getNode()->getAttribute('supannEntiteAffectation');
         var_dump($codes);
 
-        return $structure->getBy($dn, 'dn');
+        return $structureService->getBy($dn, 'dn');
     }
 
     /**
@@ -241,7 +224,7 @@ class People extends Entity
     public function getEntiteAffectationPrincipale()
     {
         throw new \Exception('Méthode pas finie');
-        $structure = $this->getLdapStructureService();
+        $structureService = $this->getService()->getLdapStructureService();
 
         $codes = [];
         $affectations = $this->getNode()->getAttribute('supannAffectation');
@@ -251,7 +234,7 @@ class People extends Entity
         $code = $this->supannAffectation;
         if (empty($dn)) return null;
 
-        return $structure->getBy($dn, 'dn');
+        return $structureService->getBy($dn, 'dn');
     }
 
     /**
@@ -264,13 +247,13 @@ class People extends Entity
     public function getAffectationDescription()
     {
         throw new \Exception('Méthode pas finie');
-        $structure = $this->getLdapStructureService();
+        $structureService = $this->getService()->getLdapStructureService();
 
         list($code, $description) = explode(';', $this->supannAffectation);
         $code = $this->supannAffectation;
         if (empty($dn)) return null;
 
-        return $structure->getBy($dn, 'dn');
+        return $structureService->getBy($dn, 'dn');
     }
 
     /**
diff --git a/src/UnicaenLdap/Service/AbstractService.php b/src/UnicaenLdap/Service/AbstractService.php
index 346aaf9..9a4ed90 100644
--- a/src/UnicaenLdap/Service/AbstractService.php
+++ b/src/UnicaenLdap/Service/AbstractService.php
@@ -17,8 +17,19 @@ use Zend\Stdlib\ErrorHandler;
  *
  * @author Laurent Lécluse <laurent.lecluse at unicaen.fr>
  */
-abstract class AbstractService
+abstract class AbstractService implements
+    LdapPeopleServiceAwareInterface,
+    LdapStructureServiceAwareInterface,
+    LdapGroupServiceAwareInterface,
+    LdapSystemServiceAwareInterface,
+    LdapGenericServiceAwareInterface
 {
+    use LdapPeopleServiceAwareTrait;
+    use LdapStructureServiceAwareTrait;
+    use LdapGroupServiceAwareTrait;
+    use LdapSystemServiceAwareTrait;
+    use LdapGenericServiceAwareTrait;
+
     /**
      * Limite de recherche par défaut
      */
@@ -53,37 +64,6 @@ abstract class AbstractService
      */
     protected $count;
 
-    /**
-     * @var array
-     */
-    protected $ldapServicesByEntityClass = [
-        \UnicaenLdap\Entity\People::class    => null,
-        \UnicaenLdap\Entity\Structure::class => null,
-        \UnicaenLdap\Entity\System::class    => null,
-        \UnicaenLdap\Entity\Group::class     => null,
-        \UnicaenLdap\Entity\Generic::class   => null,
-    ];
-
-    /**
-     * @param array
-     */
-    public function setLdapServicesByEntityClass(array $ldapServicesByEntityClass)
-    {
-        $this->ldapServicesByEntityClass = $ldapServicesByEntityClass;
-    }
-
-    /**
-     * @param string $entityClass
-     * @return mixed
-     */
-    public function getLdapServiceForEntityClass($entityClass)
-    {
-        if (! isset($this->ldapServicesByEntityClass[$entityClass])) {
-            throw new RuntimeException("Le service de recherche LDAP pour la classe d'entité $entityClass n'a pas été injecté.");
-        }
-
-        return $this->ldapServicesByEntityClass[$entityClass];
-    }
 
     /**
      * Retourne le type du service
diff --git a/src/UnicaenLdap/Service/GenericFactory.php b/src/UnicaenLdap/Service/GenericFactory.php
index d91a711..a3e2a7d 100644
--- a/src/UnicaenLdap/Service/GenericFactory.php
+++ b/src/UnicaenLdap/Service/GenericFactory.php
@@ -3,14 +3,11 @@
 namespace UnicaenLdap\Service;
 
 use Interop\Container\ContainerInterface;
+use UnicaenLdap\Ldap;
+use UnicaenLdap\Service;
 use Zend\ServiceManager\FactoryInterface;
 use Zend\ServiceManager\ServiceLocatorInterface;
 
-/**
- *
- *
- * @author Unicaen
- */
 class GenericFactory implements FactoryInterface
 {
     public function createService(ServiceLocatorInterface $serviceLocator)
@@ -18,22 +15,35 @@ class GenericFactory implements FactoryInterface
         return $this->__invoke($serviceLocator, '?');
     }
 
+    /**
+     * Create service
+     *
+     * @param ContainerInterface $container
+     * @param string $requestedName
+     * @param array|null $options
+     * @return object|Generic
+     */
     public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
     {
-        $service = new Generic();
-
-        /** @var \UnicaenLdap\Ldap $ldap */
+        /**
+         * @var Ldap $ldap
+         * @var Service\People $ldapPeopleService
+         * @var Service\Structure $ldapStructureService
+         * @var Service\Group $ldapGroupService
+         * @var Service\System $ldapSystemService
+         */
         $ldap = $container->get('ldap');
+        $ldapPeopleService      = $container->get('ldapServicePeople');
+        $ldapStructureService   = $container->get('ldapServiceStructure');
+        $ldapGroupService       = $container->get('ldapServiceGroup');
+        $ldapSystemService      = $container->get('ldapServiceSystem');
 
+        $service = new Generic();
         $service->setLdap($ldap);
-
-        $service->setLdapServicesByEntityClass([
-            \UnicaenLdap\Entity\People::class    => $container->get('ldapServicePeople'),
-            \UnicaenLdap\Entity\Structure::class => $container->get('ldapServiceStructure'),
-            \UnicaenLdap\Entity\System::class    => $container->get('ldapServiceSystem'),
-            \UnicaenLdap\Entity\Group::class     => $container->get('ldapServiceGroup'),
-//            \UnicaenLdap\Entity\Generic::class   => $container->get('ldapServiceGeneric'),
-        ]);
+        $service->setLdapPeopleService($ldapPeopleService);
+        $service->setLdapStructureService($ldapStructureService);
+        $service->setLdapGroupService($ldapGroupService);
+        $service->setLdapSystemService($ldapSystemService);
 
         return $service;
     }
diff --git a/src/UnicaenLdap/Service/GroupFactory.php b/src/UnicaenLdap/Service/GroupFactory.php
index eaa3871..4966a39 100644
--- a/src/UnicaenLdap/Service/GroupFactory.php
+++ b/src/UnicaenLdap/Service/GroupFactory.php
@@ -3,14 +3,11 @@
 namespace UnicaenLdap\Service;
 
 use Interop\Container\ContainerInterface;
+use UnicaenLdap\Ldap;
+use UnicaenLdap\Service;
 use Zend\ServiceManager\FactoryInterface;
 use Zend\ServiceManager\ServiceLocatorInterface;
 
-/**
- *
- *
- * @author Unicaen
- */
 class GroupFactory implements FactoryInterface
 {
     public function createService(ServiceLocatorInterface $serviceLocator)
@@ -18,22 +15,35 @@ class GroupFactory implements FactoryInterface
         return $this->__invoke($serviceLocator, '?');
     }
 
+    /**
+     * Create service
+     *
+     * @param ContainerInterface $container
+     * @param string $requestedName
+     * @param array|null $options
+     * @return object|Group
+     */
     public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
     {
-        $service = new Group();
-
-        /** @var \UnicaenLdap\Ldap $ldap */
+        /**
+         * @var Ldap $ldap
+         * @var Service\People $ldapPeopleService
+         * @var Service\Structure $ldapStructureService
+         * @var Service\System $ldapSystemService
+         * @var Service\Generic $ldapGenericService
+         */
         $ldap = $container->get('ldap');
+        $ldapPeopleService      = $container->get('ldapServicePeople');
+        $ldapStructureService   = $container->get('ldapServiceStructure');
+        $ldapSystemService      = $container->get('ldapServiceSystem');
+        $ldapGenericService     = $container->get('ldapServiceGeneric');
 
+        $service = new Group();
         $service->setLdap($ldap);
-
-        $service->setLdapServicesByEntityClass([
-            \UnicaenLdap\Entity\People::class    => $container->get('ldapServicePeople'),
-            \UnicaenLdap\Entity\Structure::class => $container->get('ldapServiceStructure'),
-            \UnicaenLdap\Entity\System::class    => $container->get('ldapServiceSystem'),
-//            \UnicaenLdap\Entity\Group::class     => $container->get('ldapServiceGroup'),
-            \UnicaenLdap\Entity\Generic::class   => $container->get('ldapServiceGeneric'),
-        ]);
+        $service->setLdapPeopleService($ldapPeopleService);
+        $service->setLdapStructureService($ldapStructureService);
+        $service->setLdapSystemService($ldapSystemService);
+        $service->setLdapGenericService($ldapGenericService);
 
         return $service;
     }
diff --git a/src/UnicaenLdap/Service/LdapGenericServiceAwareInterface.php b/src/UnicaenLdap/Service/LdapGenericServiceAwareInterface.php
new file mode 100644
index 0000000..96fa02c
--- /dev/null
+++ b/src/UnicaenLdap/Service/LdapGenericServiceAwareInterface.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace UnicaenLdap\Service;
+
+use UnicaenLdap\Service\Generic as LdapGenericService;
+
+interface LdapGenericServiceAwareInterface
+{
+    /**
+     * @param LdapGenericService $ldapGenericService
+     * @return mixed
+     */
+    public function setLdapGenericService(LdapGenericService $ldapGenericService);
+
+    /**
+     * @return LdapGenericService
+     */
+    public function getLdapGenericService();
+}
diff --git a/src/UnicaenLdap/Service/LdapGenericServiceAwareTrait.php b/src/UnicaenLdap/Service/LdapGenericServiceAwareTrait.php
new file mode 100644
index 0000000..c4f1646
--- /dev/null
+++ b/src/UnicaenLdap/Service/LdapGenericServiceAwareTrait.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace UnicaenLdap\Service;
+
+use UnicaenLdap\Service\Generic as LdapGenericService;
+
+trait LdapGenericServiceAwareTrait
+{
+    /**
+     * @var LdapGenericService
+     */
+    protected $ldapGenericService;
+
+    /**
+     * @param LdapGenericService $ldapGenericService
+     */
+    public function setLdapGenericService(LdapGenericService $ldapGenericService)
+    {
+        $this->ldapGenericService = $ldapGenericService;
+    }
+
+    /**
+     * @return LdapGenericService
+     */
+    public function getLdapGenericService()
+    {
+        return $this->ldapGenericService;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenLdap/Service/LdapGroupServiceAwareInterface.php b/src/UnicaenLdap/Service/LdapGroupServiceAwareInterface.php
new file mode 100644
index 0000000..a438d0f
--- /dev/null
+++ b/src/UnicaenLdap/Service/LdapGroupServiceAwareInterface.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace UnicaenLdap\Service;
+
+use UnicaenLdap\Service\Group as LdapGroupService;
+
+interface LdapGroupServiceAwareInterface
+{
+    /**
+     * @param LdapGroupService $ldapGroupService
+     * @return mixed
+     */
+    public function setLdapGroupService(LdapGroupService $ldapGroupService);
+
+    /**
+     * @return LdapGroupService
+     */
+    public function getLdapGroupService();
+}
diff --git a/src/UnicaenLdap/Service/LdapGroupServiceAwareTrait.php b/src/UnicaenLdap/Service/LdapGroupServiceAwareTrait.php
new file mode 100644
index 0000000..d6bb163
--- /dev/null
+++ b/src/UnicaenLdap/Service/LdapGroupServiceAwareTrait.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace UnicaenLdap\Service;
+
+use UnicaenLdap\Service\Group as LdapGroupService;
+
+trait LdapGroupServiceAwareTrait
+{
+    /**
+     * @var LdapGroupService
+     */
+    protected $ldapGroupService;
+
+    /**
+     * @param LdapGroupService $ldapGroupService
+     */
+    public function setLdapGroupService(LdapGroupService $ldapGroupService)
+    {
+        $this->ldapGroupService = $ldapGroupService;
+    }
+
+    /**
+     * @return LdapGroupService
+     */
+    public function getLdapGroupService()
+    {
+        return $this->ldapGroupService;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenLdap/Service/LdapPeopleServiceAwareInterface.php b/src/UnicaenLdap/Service/LdapPeopleServiceAwareInterface.php
index 40e8f85..c08423e 100644
--- a/src/UnicaenLdap/Service/LdapPeopleServiceAwareInterface.php
+++ b/src/UnicaenLdap/Service/LdapPeopleServiceAwareInterface.php
@@ -6,5 +6,14 @@ use UnicaenLdap\Service\People as LdapPeopleService;
 
 interface LdapPeopleServiceAwareInterface
 {
+    /**
+     * @param LdapPeopleService $ldapPeopleService
+     * @return mixed
+     */
     public function setLdapPeopleService(LdapPeopleService $ldapPeopleService);
-}
\ No newline at end of file
+
+    /**
+     * @return LdapPeopleService
+     */
+    public function getLdapPeopleService();
+}
diff --git a/src/UnicaenLdap/Service/LdapPeopleServiceAwareTrait.php b/src/UnicaenLdap/Service/LdapPeopleServiceAwareTrait.php
index f544682..dd69462 100644
--- a/src/UnicaenLdap/Service/LdapPeopleServiceAwareTrait.php
+++ b/src/UnicaenLdap/Service/LdapPeopleServiceAwareTrait.php
@@ -18,4 +18,12 @@ trait LdapPeopleServiceAwareTrait
     {
         $this->ldapPeopleService = $ldapPeopleService;
     }
+
+    /**
+     * @return LdapPeopleService
+     */
+    public function getLdapPeopleService()
+    {
+        return $this->ldapPeopleService;
+    }
 }
\ No newline at end of file
diff --git a/src/UnicaenLdap/Service/LdapStructureServiceAwareInterface.php b/src/UnicaenLdap/Service/LdapStructureServiceAwareInterface.php
new file mode 100644
index 0000000..1ce386a
--- /dev/null
+++ b/src/UnicaenLdap/Service/LdapStructureServiceAwareInterface.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace UnicaenLdap\Service;
+
+use UnicaenLdap\Service\Structure as LdapStructureService;
+
+interface LdapStructureServiceAwareInterface
+{
+    /**
+     * @param LdapStructureService $ldapStructureService
+     * @return mixed
+     */
+    public function setLdapStructureService(LdapStructureService $ldapStructureService);
+
+    /**
+     * @return LdapStructureService
+     */
+    public function getLdapStructureService();
+}
diff --git a/src/UnicaenLdap/Service/LdapStructureServiceAwareTrait.php b/src/UnicaenLdap/Service/LdapStructureServiceAwareTrait.php
new file mode 100644
index 0000000..f8d4c20
--- /dev/null
+++ b/src/UnicaenLdap/Service/LdapStructureServiceAwareTrait.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace UnicaenLdap\Service;
+
+use UnicaenLdap\Service\Structure as LdapStructureService;
+
+trait LdapStructureServiceAwareTrait
+{
+    /**
+     * @var LdapStructureService
+     */
+    protected $ldapStructureService;
+
+    /**
+     * @param LdapStructureService $ldapStructureService
+     */
+    public function setLdapStructureService(LdapStructureService $ldapStructureService)
+    {
+        $this->ldapStructureService = $ldapStructureService;
+    }
+
+    /**
+     * @return LdapStructureService
+     */
+    public function getLdapStructureService()
+    {
+        return $this->ldapStructureService;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenLdap/Service/LdapSystemServiceAwareInterface.php b/src/UnicaenLdap/Service/LdapSystemServiceAwareInterface.php
new file mode 100644
index 0000000..d6c6efa
--- /dev/null
+++ b/src/UnicaenLdap/Service/LdapSystemServiceAwareInterface.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace UnicaenLdap\Service;
+
+use UnicaenLdap\Service\System as LdapSystemService;
+
+interface LdapSystemServiceAwareInterface
+{
+    /**
+     * @param LdapSystemService $ldapSystemService
+     * @return mixed
+     */
+    public function setLdapSystemService(LdapSystemService $ldapSystemService);
+
+    /**
+     * @return LdapSystemService
+     */
+    public function getLdapSystemService();
+}
diff --git a/src/UnicaenLdap/Service/LdapSystemServiceAwareTrait.php b/src/UnicaenLdap/Service/LdapSystemServiceAwareTrait.php
new file mode 100644
index 0000000..6b86710
--- /dev/null
+++ b/src/UnicaenLdap/Service/LdapSystemServiceAwareTrait.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace UnicaenLdap\Service;
+
+use UnicaenLdap\Service\System as LdapSystemService;
+
+trait LdapSystemServiceAwareTrait
+{
+    /**
+     * @var LdapSystemService
+     */
+    protected $ldapSystemService;
+
+    /**
+     * @param LdapSystemService $ldapSystemService
+     */
+    public function setLdapSystemService(LdapSystemService $ldapSystemService)
+    {
+        $this->ldapSystemService = $ldapSystemService;
+    }
+
+    /**
+     * @return LdapSystemService
+     */
+    public function getLdapSystemService()
+    {
+        return $this->ldapSystemService;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenLdap/Service/PeopleFactory.php b/src/UnicaenLdap/Service/PeopleFactory.php
index 485f02a..b1de6d3 100644
--- a/src/UnicaenLdap/Service/PeopleFactory.php
+++ b/src/UnicaenLdap/Service/PeopleFactory.php
@@ -3,6 +3,8 @@
 namespace UnicaenLdap\Service;
 
 use Interop\Container\ContainerInterface;
+use UnicaenLdap\Ldap;
+use UnicaenLdap\Service;
 use Zend\ServiceManager\FactoryInterface;
 use Zend\ServiceManager\ServiceLocatorInterface;
 
@@ -18,22 +20,35 @@ class PeopleFactory implements FactoryInterface
         return $this->__invoke($serviceLocator, '?');
     }
 
+    /**
+     * Create service
+     *
+     * @param ContainerInterface $container
+     * @param string $requestedName
+     * @param array|null $options
+     * @return object|People
+     */
     public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
     {
-        $service = new People();
-
-        /** @var \UnicaenLdap\Ldap $ldap */
+        /**
+         * @var Ldap $ldap
+         * @var Service\Structure $ldapStructureService
+         * @var Service\Group $ldapGroupService
+         * @var Service\System $ldapSystemService
+         * @var Service\Generic $ldapGenericService
+         */
         $ldap = $container->get('ldap');
+        $ldapStructureService   = $container->get('ldapServiceStructure');
+        $ldapGroupService       = $container->get('ldapServiceGroup');
+        $ldapSystemService      = $container->get('ldapServiceSystem');
+        $ldapGenericService     = $container->get('ldapServiceGeneric');
 
+        $service = new People();
         $service->setLdap($ldap);
-
-        $service->setLdapServicesByEntityClass([
-//            \UnicaenLdap\Entity\People::class    => $container->get('ldapServicePeople'),
-            \UnicaenLdap\Entity\Structure::class => $container->get('ldapServiceStructure'),
-            \UnicaenLdap\Entity\System::class    => $container->get('ldapServiceSystem'),
-            \UnicaenLdap\Entity\Group::class     => $container->get('ldapServiceGroup'),
-            \UnicaenLdap\Entity\Generic::class   => $container->get('ldapServiceGeneric'),
-        ]);
+        $service->setLdapStructureService($ldapStructureService);
+        $service->setLdapGroupService($ldapGroupService);
+        $service->setLdapSystemService($ldapSystemService);
+        $service->setLdapGenericService($ldapGenericService);
 
         return $service;
     }
diff --git a/src/UnicaenLdap/Service/StructureFactory.php b/src/UnicaenLdap/Service/StructureFactory.php
index 33cd58a..7759770 100644
--- a/src/UnicaenLdap/Service/StructureFactory.php
+++ b/src/UnicaenLdap/Service/StructureFactory.php
@@ -3,6 +3,8 @@
 namespace UnicaenLdap\Service;
 
 use Interop\Container\ContainerInterface;
+use UnicaenLdap\Ldap;
+use UnicaenLdap\Service;
 use Zend\ServiceManager\FactoryInterface;
 use Zend\ServiceManager\ServiceLocatorInterface;
 
@@ -18,22 +20,35 @@ class StructureFactory implements FactoryInterface
         return $this->__invoke($serviceLocator, '?');
     }
 
+    /**
+     * Create service
+     *
+     * @param ContainerInterface $container
+     * @param string $requestedName
+     * @param array|null $options
+     * @return object|Structure
+     */
     public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
     {
-        $service = new Structure();
-
-        /** @var \UnicaenLdap\Ldap $ldap */
+        /**
+         * @var Ldap $ldap
+         * @var Service\People $ldapPeopleService
+         * @var Service\Group $ldapGroupService
+         * @var Service\System $ldapSystemService
+         * @var Service\Generic $ldapGenericService
+         */
         $ldap = $container->get('ldap');
+        $ldapPeopleService      = $container->get('ldapServicePeople');
+        $ldapGroupService       = $container->get('ldapServiceGroup');
+        $ldapSystemService      = $container->get('ldapServiceSystem');
+        $ldapGenericService     = $container->get('ldapServiceGeneric');
 
+        $service = new Structure();
         $service->setLdap($ldap);
-
-        $service->setLdapServicesByEntityClass([
-            \UnicaenLdap\Entity\People::class    => $container->get('ldapServicePeople'),
-//            \UnicaenLdap\Entity\Structure::class => $container->get('ldapServiceStructure'),
-            \UnicaenLdap\Entity\System::class    => $container->get('ldapServiceSystem'),
-            \UnicaenLdap\Entity\Group::class     => $container->get('ldapServiceGroup'),
-            \UnicaenLdap\Entity\Generic::class   => $container->get('ldapServiceGeneric'),
-        ]);
+        $service->setLdapPeopleService($ldapPeopleService);
+        $service->setLdapGroupService($ldapGroupService);
+        $service->setLdapSystemService($ldapSystemService);
+        $service->setLdapGenericService($ldapGenericService);
 
         return $service;
     }
diff --git a/src/UnicaenLdap/Service/SystemFactory.php b/src/UnicaenLdap/Service/SystemFactory.php
index 9d036e7..73953d8 100644
--- a/src/UnicaenLdap/Service/SystemFactory.php
+++ b/src/UnicaenLdap/Service/SystemFactory.php
@@ -3,6 +3,8 @@
 namespace UnicaenLdap\Service;
 
 use Interop\Container\ContainerInterface;
+use UnicaenLdap\Ldap;
+use UnicaenLdap\Service;
 use Zend\ServiceManager\FactoryInterface;
 use Zend\ServiceManager\ServiceLocatorInterface;
 
@@ -18,22 +20,35 @@ class SystemFactory implements FactoryInterface
         return $this->__invoke($serviceLocator, '?');
     }
 
+    /**
+     * Create service
+     *
+     * @param ContainerInterface $container
+     * @param string $requestedName
+     * @param array|null $options
+     * @return object|System
+     */
     public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
     {
-        $service = new System();
-
-        /** @var \UnicaenLdap\Ldap $ldap */
+        /**
+         * @var Ldap $ldap
+         * @var Service\People $ldapPeopleService
+         * @var Service\Structure $ldapStructureService
+         * @var Service\Group $ldapGroupService
+         * @var Service\Generic $ldapGenericService
+         */
         $ldap = $container->get('ldap');
+        $ldapPeopleService      = $container->get('ldapServicePeople');
+        $ldapStructureService   = $container->get('ldapServiceStructure');
+        $ldapGroupService       = $container->get('ldapServiceGroup');
+        $ldapGenericService     = $container->get('ldapServiceGeneric');
 
+        $service = new System();
         $service->setLdap($ldap);
-
-        $service->setLdapServicesByEntityClass([
-            \UnicaenLdap\Entity\People::class    => $container->get('ldapServicePeople'),
-            \UnicaenLdap\Entity\Structure::class => $container->get('ldapServiceStructure'),
-//            \UnicaenLdap\Entity\System::class    => $container->get('ldapServiceSystem'),
-            \UnicaenLdap\Entity\Group::class     => $container->get('ldapServiceGroup'),
-            \UnicaenLdap\Entity\Generic::class   => $container->get('ldapServiceGeneric'),
-        ]);
+        $service->setLdapPeopleService($ldapPeopleService);
+        $service->setLdapStructureService($ldapStructureService);
+        $service->setLdapGroupService($ldapGroupService);
+        $service->setLdapGenericService($ldapGenericService);
 
         return $service;
     }
-- 
GitLab