2017-05-16 1 views
1

J'ai une classe de référentiel personnalisée dans laquelle je dois injecter une classe qui m'aide à télécharger un fichier, et à effacer le fichier si nécessaire. J'ai développé le constructeur EntityRepository, mais je ne sais pas comment ajouter le troisième argument à l'intérieur de la classe de repository personnalisée. Je reçois toujours l'erreur que le troisième argument passé au constructeur est null.Comment puis-je injecter une classe à l'intérieur d'un dépôt personnalisé - Symfony 2.7

+0

Copie possible de [Créer un référentiel de doctrine avec des dépendances (injection de dépendances) dans ZF2] (http://stackoverflow.com/questions/33630909/create-a-doctrine-repository-with-dependencies-dependency-injection-in -zf2) – malarzm

+0

comment instanciez-vous votre référentiel personnalisé? – hassan

+1

Vous devrez définir le référentiel en tant que service et ajouter une méthode setUploader. Stackoverflow a quelques centaines d'exemples montrant comment. – Cerad

Répondre

1

Depuis la version 2.4 Doctrine utilise un RepositoryFactory pour l'instanciation des référentiels et en tant que démarreur vous fournit DefaultRepositoryFactory. Pour être en mesure d'injecter des dépendances supplémentaires dans vos référentiels, vous devez rouler votre propre mise en œuvre de l'usine mentionnée ci-dessus (j'omets toutes les déclarations use par souci de brièveté):

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

Après l'enregistrement de votre usine en tant que service de la manière vous préférez, vous devez ajuster la configuration doctrine avec:

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

Et vous êtes bon pour vous!

+0

Merci. Intéressant que repository_factory soit documenté ici http://symfony.com/doc/current/bundles/DoctrineBundle/configuration.html mais pas ici http://symfony.com/doc/current/reference/configuration/doctrine.html – Cerad