Symfony: Autowire dei repository Doctrine (Repositories as Service)

Con la versione 3.3, Symfony ha introdotto l’autowrire e l’autoconfigure dei servizi, risparmiando a noi developer parecchio lavoro “noioso”.

Spesso capita di dovere iniettare un repository Doctrine: out of the box non è possibile farlo. Di default infatti i repository non sono dichiarati come servizi e non sono quindi utilizzabili con l’autowire.

Per risolvere il problema bastano due semplici modifiche:

  • Il repository deve estendere la classe “Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository”
  • Nel costruttore del repository bisogna richiamare il parent passandogli l’entity di riferimento: parent::__construct($registry, Foo::class);

Ad esempio, il repository FooRepository dell’entity Foo andrebbe quindi dichiarato così:

// ....

use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;

// ....

class FooRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, Foo::class);
    }
}

Con questa modifica possiamo quindi iniettare il repository all’interno di un servizio o di un controller:

// ....

class FooService
{
    public function __construct(FooRepository $fooRepository)
    {
        // ....
    }
}

Madisoft
Madisoft
Articoli: 20

Lascia una risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.