Blog


Définir un Repository en tant que service

Le , par .

Lorsque vous avez besoin de récupérer des entités depuis un service, il est courant d'injecter l'EntityManager en entier. Il serait beaucoup plus propre et plus simple de n'injecter que le Repository de l'entité concernée, afin d'accéder directement à ses méthodes.

Malheureusement un Repository n'est pas un service... du moins pas avant qu'on ne le définisse comme tel ! Il faut pour cela passer par un Factory, qui lui n'est rien d'autre que ledit EntityManager.

Voici comment définir un Repository en tant que service, à mettre dans votre services.yml ou équivalent. Je prends l'exemple du Repository de l'entité Article :

services:
    sdzblog.repository.article:
        class: Sdz\BlogBundle\Entity\ArticleRepository
        factory_service: doctrine.orm.default_entity_manager
        factory_method: getRepository
        arguments: ['SdzBlogBundle:Article']

Vous pouvez maintenant utiliser ou injecter le service sdzblog.repository.article où vous voulez.

That's it!

Retour à la liste

Commentaires

Le , a écrit :

Encore plus simple depuis SF 2.7:

@=service('doctrine').getRepository('AppBundle:Entity')


Le , a écrit :

votre differents cours sont vraiment super


Le , a écrit :

cool!


Le , a écrit :

@Nico : ce qui n'est pas le but du repository dans tous les cas.


Le , a écrit :

Pas bête du tout... Mais comment appeler un service depuis un service ?


Le , a écrit :

Merci pour l'astuce :)


Le , a écrit :

Bonne idée, mais - corrige moi si je me trompe - cette solution n'est plus adaptée dès lors que l'on a besoin de persistance. Les méthodes (persist()/flush()/commit()/detach()) de l'EntityManager ne sont alors plus accessibles.


Le , a écrit :

@Nico tout à fait, cette solution n'est à utiliser que si tu veux uniquement récupérer des entités.


Le , a écrit :

Merci :)


Poster un nouveau commentaire