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)
{
// ....
}
}
