Come posso inserire la class all'interno del repository personalizzato – Symfony 2.7

Ho una class di repository personalizzata in cui devo iniettare la class che mi aiuta a caricare il file e cancellare il file se necessario. Ho ampliato il constructor di EntityRepository, ma non so come aggiungere un terzo argomento all'interno della class di repository personalizzata.

class NewRepository extends EntityRepository { protected $fileUploader; public function __construct(EntityManager $em, Mapping\ClassMetadata $class,FileUploader $fileUploader) { parent::__construct($em, $class); } public function create($data, Item $item = null) { $em = $this->getEntityManager(); if(!$item) $item = new Item(); if(isset($data['file'])) { $image = $this->fileUploader->setFile($data['file'])->uploadFile(); $data['filename'] = $image['filename']; $data['image_url'] = $image['file_url']; } $item->setTitle($data['title']); $item->setDescription($data['description']); $em->persist($item); $em->flush($item); return $item; } } 

Ricevo sempre l'errore che il terzo argomento passato al constructor è nullo.

Dalla versione 2.4, Doctrine utilizza RepositoryFactory per DefaultRepositoryFactory istanze di repository e come iniziatore fornisce DefaultRepositoryFactory . Per essere in grado di iniettare dependencies aggiuntive nei repository, è necessario eseguire la propria implementazione della suddetta fabbrica (sto omettendo tutte le istruzioni use per brevità):

 class YourRepositoryFactory implements RepositoryFactory { private $fileUploader; public function __construct(FileUploader $fileUploader) { $this->fileUploader = $fileUploader; } public function getRepository(EntityManagerInterface $entityManager, $entityName) { $repositoryHash = $entityManager->getClassMetadata($entityName)->getName() . spl_object_hash($entityManager); if (isset($this->repositoryList[$repositoryHash])) { return $this->repositoryList[$repositoryHash]; } return $this->repositoryList[$repositoryHash] = $this->createRepository($entityManager, $entityName); } private function createRepository(EntityManagerInterface $entityManager, $entityName) { /* @var $metadata \Doctrine\ORM\Mapping\ClassMetadata */ $metadata = $entityManager->getClassMetadata($entityName); $repositoryClassName = $metadata->customRepositoryClassName ?: $entityManager->getConfiguration()->getDefaultRepositoryClassName(); switch ($repositoryClassName) { case NewRepository::class: return new $repositoryClassName($entityManager, $metadata, $this->fileUploader); default: return new $repositoryClassName($entityManager, $metadata); } } } 

Dopo aver registrato la tua fabbrica come servizio nel modo che preferisci, devi adattare la configuration di doctrine con:

 doctrine: orm: repository_factory: name.of.your.factory.service 

E tu sei bello andare!