Chargement...

Symfony : Astuce pour mieux manager ses repository dans un bundle ou projet

Petit astuce que j'utilise sur certains de mes projets Symfony où j'ai un certain nombre de classes ! La suite dans l'article :)

Petit retour d'expérience sur un projet Symfony assez conséquent où j'ai du réadapter mon code pour mieux organiser mes services (injection de dépendance). Je trouve intéressant de pouvoir accéder à ses repository à n'importe quel moment pour effectuer des inserts, des traitements ou même des validations. L'idée est d'avoir un manager pour l'ensemble des repository de votre bundle. Ce manager injectera dans son constructeur l'ensemble des repository de votre bundle et vous injecterez ce manager dans vos autres services.

 

Je vous montre tout ceci avec le code ci-dessous qui reprend un exemple de manager de Repository pour le bundle CrmBundle :

 



namespace CrmBundle\Service\Repository;

use CrmBundle\Repository\Client\ClientRepository;

class RepositoryManager {

    protected $em;

    protected $clientRepository;

    public function __construct(ClientRepository $clientRepository) {
        $this->clientRepository = $clientRepository;
    }

    public function getClientRepository() {
        return $this->clientRepository;
    }
}

Dans cette exemple on retrouve un service qui attend dans son constructeur le repository de l'entité Client. On peut imaginer une deuxième classe nommée Contact et le repository ContactRepository. Vous pourrez ainsi passer en deuxième argument du constructeur la class ContactRepository et obtenir ainsi un manager qui peut vous renvoyer les deux repository et l'ensemble des fonctions DQL custom que vous développerez. Utiliser cette technique avec un IDE tel que PhpStorm est évidemment recommandé pour beneficier de l'ensemble des fonctionnalités (proposition de fonctions, des arguments, autocompletion, etc)

 

Voici maintenant le code pour mettre en place le manager en tant que service :

 

 



    crm.client.repository:
            class: CrmBundle\Repository\Client\ClientRepository
            factory: ["@doctrine.orm.entity_manager", getRepository]
            arguments:
                - CrmBundle\Entity\Client\Client

    crm.repository.manager:
        class: CrmBundle\Service\Repository\RepositoryManager
        arguments: ["@crm.client.repository"]


Pour finir je vous montre comment utiliser ce manager dans un autre service qui a besoin de disposer des repository dans certaines de ses fonctions : Pour cette exemple j'ai mis en place un ClientManager qui permet parmi un ensemble de fonctions de supprimer un Client.

 

Voici le code pour activer ce service : 

 

 


    crm.client.manager:
        class: CrmBundle\Service\Client\ClientManager
        arguments: ["@doctrine.orm.entity_manager","@crm.repository.manager","@back.notification.manager"]

Le premier paramètre est le service de doctrine, le deuxieme paramètre est justement notre manager que nous venons de créer et le troisième paramètre est un service qui gére les notifications mais je reviendrai dessus autour d'un article dédié à ce sujet.

 

Voici maintenance le code pour le service ClientManager :

 

 



namespace CrmBundle\Service\Client;

use BackBundle\Service\Notification\NotificationManager;
use CrmBundle\Service\Repository\RepositoryManager;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;


class ClientManager {

    protected $em;

    protected $repositoryManager;

    protected $notificationManager;


    public function __construct(\Doctrine\ORM\EntityManager $em, RepositoryManager $repositoryManager, NotificationManager $notificationManager) {
        $this->em = $em;
        $this->repositoryManager = $repositoryManager;
        $this->notificationManager = $notificationManager;
    }
}


Vous pouvez dès maintenant accéder à votre Manager de Repository en utilisant :

 

$this->repositoryManager

 

et manager le repository de votre classe Client via le bout de code suivant :

 

$this->repositoryManager->getClientRepository()

 

 

J'éspère que cette petite astuce vous a plu et vous servira dans vos futurs projets ! A bientôt pour de nouvelles astuces Symfony  ;)


Tags sur l'article

Commentaires (0)

Laisser nous un commentaire