Declaring Doctrine repositories as services

Published on 2019-08-27 • Modified on 2020-02-17

[Edit 2020-02-19] Please read my blog post on this topic.
This is was my preferred way to declare and use Doctrine repositories. It allows to directly inject it wherever you need. Moreover, you have auto-completion in the IDE (PhpStorm with the Symfony plugin for example) as the service class is known. It's not the case when directly using the Doctrine getRepository() function inside a controller.


<?php declare(strict_types=1);

// src/Controller/Snippet/Snippet40Trait.php

namespace App\Controller\Snippet;

use App\Repository\ArticleRepository;

/**
 * I am using a PHP trait to isolate each snippet in a file.
 * This code should be called from a Symfony controller extending AbstractController (as of Symfony 4.2)
 * or Symfony\Bundle\FrameworkBundle\Controller\Controller (Symfony <= 4.1).
 * Services are injected in the main controller constructor.
 *
 * @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! 😁
    }
}

 Run this snippet  More on Stackoverflow  More on the web  Random snippet