2017-05-16 23 views
1

我有自定义库类,我必须注入类,可以帮助我上传的文件,如果需要删除的文件。我扩展了EntityRepository构造函数,但我不知道如何在自定义存储库类中添加第三个参数。我怎么可以注入类定制仓库里 - Symfony的2.7

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; 
     } 

    } 

我总是得到错误,传递给构造函数的第三个参数为null。

+0

[在ZF2中使用依赖项(依赖注入)创建一个doctrine仓库的可能的重复](http://stackoverflow.com/questions/33630909/create-a-doctrine-repository-with-dependencies-dependency-injection-in -zf2) – malarzm

+0

如何实例化自定义存储库? – hassan

+1

您需要将存储库定义为服务并添加setUploader方法。 Stackoverflow有几百个例子显示了如何。 – Cerad

回答

1

由于版本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 

,你是好去!

+0

谢谢。有趣的是repository_factory记录在这里http://symfony.com/doc/current/bundles/DoctrineBundle/configuration.html但不是在这里http://symfony.com/doc/current/reference/configuration/doctrine.html – Cerad

相关问题