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ì:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// .... 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:
1 2 3 4 5 6 7 8 9 |
// .... class FooService { public function __construct(FooRepository $fooRepository) { // .... } } |