2017-05-16 26 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

相關問題