Déclarer les dépôts Doctrine en tant que services

Publié le 27/08/2019 • Mis à jour le 27/08/2019

English language detected! 🇬🇧

  We noticed that your browser is using English. Do you want to read this post in this language?

Read the english version 🇬🇧

C'est ma manière préférée de déclarer et d'utiliser les dépôts Doctrine (🇬🇧 : repository). Ça permet de les injecter à n'importe quel endroit ou on en a besoin. De plus, on bénéficie de l'auto-complétion dans l'IDE (dans PhpStorm avec le plugin Symfony par exemple) puisque la classe du service est connue. Ce qui n'est pas le cas quand on utilise directement la fonction getRepository() à l'intérieur d'un contrôleur.


# config/packages/doctrine.yaml
services:
    App\Entity\ArticleRepository:
        class: App\Entity\ArticleRepository
        factory: ['@doctrine.orm.default_entity_manager', getRepository]
        arguments:
            - App\Entity\Article

En bonus, le snippet permettant d'utiliser ce code : 🎉
<?php declare(strict_types=1);

// src/Controller/Snippet/Snippet40Trait.php

namespace App\Controller\Snippet;

use App\Entity\ArticleRepository;

/**
 * J'utilise un trait PHP afin d'isoler chaque snippet dans un fichier.
 * Ce code doit être apellé d'un contrôleur Symfony étendant AbstractController (depuis Symfony 4.2)
 * ou Symfony\Bundle\FrameworkBundle\Controller\Controller (Symfony <= 4.1).
 * Les services sont injectés dans le constructeur du contrôleur principal.
 *
 * @property ArticleRepository $articleRepo
 */
trait Snippet40Trait
{
    public function snippet40(): void
    {
        // In fact the article repository service is injected in the main controller constructor
        $articles = $this->articleRepo->findArticlesForLang('en');

        //  We've got autocompletion on the ArticleRepository functions like "findArticlesForLang".

        echo sprintf('%d posts found! 📚', count($articles));

        // That's it! 😁
    }
}

 Exécuter le snippet  Plus sur Stackoverflow  Plus sur le web