У меня есть пользовательский класс репозитория, в котором я должен вводить класс, который помогает мне загружать файл и при необходимости удалять файл. Я расширил конструктор EntityRepository, но я не знаю, как добавить третий аргумент в пользовательский класс репозитория.
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; } }
Я всегда получаю ошибку, которую третий аргумент, переданный конструктору, равен нулю.
Начиная с версии 2.4 Doctrine использует RepositoryFactory
для создания репозиториев и как стартер предоставляет вам DefaultRepositoryFactory
. Чтобы иметь возможность вводить дополнительные зависимости в свои репозитории, вам нужно выполнить собственную реализацию вышеупомянутой фабрики (я сокращаю все операторы use
для краткости):
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); } } }
После регистрации вашей фабрики в качестве службы в том виде, в каком вы предпочитаете, вам необходимо настроить настройку doctrine
с помощью:
doctrine: orm: repository_factory: name.of.your.factory.service
И ты в порядке!