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
Répondre
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!
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
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
comment instanciez-vous votre référentiel personnalisé? – hassan
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