Come iniettare un repository in un servizio in Symfony2?

Ho bisogno di iniettare due oggetti in ImageService . Uno di questi è un'istanza di Repository/ImageRepository , che ottengo così:

 $image_repository = $container->get('doctrine.odm.mongodb') ->getRepository('MycompanyMainBundle:Image'); 

Quindi come posso dichiararlo nel mio services.yml? Ecco il servizio:

 namespace Mycompany\MainBundle\Service\Image; use Doctrine\ODM\MongoDB\DocumentRepository; class ImageManager { private $manipulator; private $repository; public function __construct(ImageManipulatorInterface $manipulator, DocumentRepository $repository) { $this->manipulator = $manipulator; $this->repository = $repository; } public function findAll() { return $this->repository->findAll(); } public function createThumbnail(ImageInterface $image) { return $this->manipulator->resize($image->source(), 300, 200); } } 

Ecco una soluzione ripulita per coloro che provengono da Google come me:

Aggiornamento: ecco la soluzione Symfony 2.6 (e successiva):

 services: myrepository: class: Doctrine\ORM\EntityRepository factory: ["@doctrine.orm.entity_manager", getRepository] arguments: - MyBundle\Entity\MyClass myservice: class: MyBundle\Service\MyService arguments: - "@myrepository" 

Soluzione deprecata (Symfony 2.5 e inferiore):

 services: myrepository: class: Doctrine\ORM\EntityRepository factory_service: doctrine.orm.entity_manager factory_method: getRepository arguments: - MyBundle\Entity\MyClass myservice: class: MyBundle\Service\MyService arguments: - "@myrepository" 

Ho trovato questo link e questo ha funzionato per me:

 parameters: image_repository.class: Mycompany\MainBundle\Repository\ImageRepository image_repository.factory_argument: 'MycompanyMainBundle:Image' image_manager.class: Mycompany\MainBundle\Service\Image\ImageManager image_manipulator.class: Mycompany\MainBundle\Service\Image\ImageManipulator services: image_manager: class: %image_manager.class% arguments: - @image_manipulator - @image_repository image_repository: class: %image_repository.class% factory_service: doctrine.odm.mongodb factory_method: getRepository arguments: - %image_repository.factory_argument% image_manipulator: class: %image_manipulator.class% 

Nel caso in cui se non si desidera definire ciascun repository come un servizio, a partire dalla versione 2.4 è ansible eseguire le seguenti operazioni (l' default è un nome del gestore entity framework;):

 @=service('doctrine.orm.default_entity_manager').getRepository('MycompanyMainBundle:Image') 

2017 e Symfony 3.3+ lo hanno reso molto più semplice.

Controlla il mio post Come utilizzare Repository con Doctrine as Service in Symfony per una descrizione più generale.

Per il tuo codice, tutto ciò che devi fare è usare la composizione sull'ereditarietà – uno dei templates SOLID.

1. Creare il proprio repository senza dipendenza diretta su Doctrine

 <?php namespace MycompanyMainBundle\Repository; use Doctrine\ORM\EntityManagerInterface; use MycompanyMainBundle\Entity\Image; class ImageRepository { private $repository; public function __construct(EntityManagerInterface $entityManager) { $this->repository = $entityManager->getRepository(Image::class); } // add desired methods here public function findAll() { return $this->repository->findAll(); } } 

2. Aggiungi la logging di configuration con autologging basata su PSR-4

 # app/config/services.yml services: _defaults: autowire: true MycompanyMainBundle\: resource: ../../src/MycompanyMainBundle 

3. Ora puoi aggiungere qualsiasi dipendenza ovunque tramite l'iniezione di constructo

 use MycompanyMainBundle\Repository\ImageRepository; class ImageService { public function __construct(ImageRepository $imageRepository) { $this->imageRepository = $imageRepository; } }