Choisir l'Entity Manager lors de la déclaration du Provider dans la sécurité de Symfony2

Voici un cas particulier qui aidera peut être d'autres développeurs. J'ai une application Symfony2 avec plusieurs bases de données, plusieurs identifications et donc plusieurs Providers pour l'authentification. Dans cet article je vous présente comment choisir quel Entity Manager utiliser pour chaque Provider.

Dans le fichier security.yml, quand on déclare un Provider de type Entity, on utilise la classe EntityUserProvider. Il suffit de regarder le code de cette classe pour voir qu'elle prend en dernier parametre de son constructeur  le nom du manager.

class EntityUserProvider implements UserProviderInterface
{
    private $class;
    private $repository;
    private $property;
    private $metadata;
 
    public function __construct(ManagerRegistry $registry, $class, $property = null, $managerName = null)
    {
        $em = $registry->getManager($managerName);
        $this->class = $class;
        $this->metadata = $em->getClassMetadata($class);
 
        if (false !== strpos($this->class, ':')) {
            $this->class = $this->metadata->getName();
        }
 
        $this->repository = $em->getRepository($class);
        $this->property = $property;
    }

Cette classe est instanciée par un service créé automatiquement à partir de la config du fichier security.yml.

C'est la classe EntityFactory qui est chargée de créer ce service et en regardant le code de sa fonction create() on voit qu'il est possible de passer une option de configuration: manager_name

    public function create(ContainerBuilder $container, $id, $config)
    {
        $container
            ->setDefinition($id, new DefinitionDecorator($this->providerId))
            ->addArgument($config['class'])
            ->addArgument($config['property'])
            ->addArgument($config['manager_name'])
        ;
    }

Il suffit donc de spécifier le paramètre manager_name dans la définition des providers du fichier security.yml pour dire à Symfony2 quelle base de donnée on veut utiliser.

    providers:
        api_secured:
            entity: { class: PrismeCalculatorBundle:Api, manager_name: mabdd_v3 }

 

Et voilà plutôt simple non? J'ai quand même fouillé une bonne heure dans les sources de Symfony2 pour trouver ça.

Ajouter un commentaire