IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Multiple connection db avec symfony 4


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2016
    Messages : 9
    Par défaut Multiple connection db avec symfony 4
    Bonjour,

    Depuis quelques jours je me casse la tête pour trouver une solution à mon problème. Via certaines informations que je reçois je voudrais dans un event listener changer les informations de connexion à la base de données par défaut pour pouvoir aller sur la base de données correspondant au bon client.

    Mais je ne trouve pas de solution. Je pourrais créer toutes les connections dans le fichier de configuration mais j'aimerais que la connections soit faite dans l'event listener pour que dans le reste du code j'utilise doctrine normalement.

    c'est-à-dire avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->getDoctrine()->getManager()->getRepository(maClass::class)->findAll();
    donc ne pas mettre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->getDoctrine()->getManager('maConnextion')->getRepository(Maclass::class)->findAll();
    Il doit surement y avoir un moyen mais j'ai du passer à côté. Si vous pouviez m'aider ce serait cool.

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2016
    Messages : 9
    Par défaut
    Bonjour,

    Effectivement cette partie est intéressante mais ce n'est pas ce que je demande.

    Le problème dans le cas là c'est qu'il faut créer une connexion par base de données et si il y en a 100 ou 300 c'est juste ingérable de mettre tout dans le fichier de config.

    En plus pour avoir accès je dois faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $this->getDoctrine()->getManager('maConnextion1')->getRepository(Maclass::class)->findAll();
     
    $this->getDoctrine()->getManager('maConnextion2')->getRepository(Maclass::class)->findAll();
     
    $this->getDoctrine()->getManager('maConnextion3')->getRepository(Maclass::class)->findAll();
    Moi j'aimerais éviter les maConnexion1, maConnexion2 ...

    Je ne sais pas si je me fait bien comprend?

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Par défaut
    Ah ouais, j'ai mal lu ton message.

    C'est faisable si tu veux juste utiliser SQL avec une connexion, mais si tu veux avoir l'ORM en entier ça risque d'être compliqué je pense.

    - Les informations de L'ORM sont liées à la connexion en cours donc si tu changes de connexion tes entités ne seront plus reconnues.

    - Et même si tu parvenais à résoudre ce problème, pour accéder à ta nouvelle EntityManager comme tu le veux (sans nom à l'avance) il faut remplacer l'entitymanager par défaut dans le conteneur avec la nouvelle. Or si tu reçois les informations de connexion en cours de traitement, à ce moment là le conteneur est déjà compilé et mis en cache. Il te faudra donc remplacer l'entitymanager dans le conteneur, puis le re-construire / recompiler, vider le cache et le mettre en cache.

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2016
    Messages : 9
    Par défaut
    d'accord donc le plus simple c'est encore d'ajouter chaque connexion dans le fichier de config et de mettre à chaque fois le nom de la connexion dans getManager alors.
    Mais si j'ai 100 connexions ça ne risque pas d'être un problème? au niveau vitesse d'exécution par exemple?

    Dans la documentation de doctrine j'ai trouvé qu'on pouvait faire un entityManager comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    use Doctrine\ORM\Tools\Setup;
    use Doctrine\ORM\EntityManager;
     
    $paths = array('/path/to/entity/mapping/files');
     
    $config = Setup::createAnnotationMetadataConfiguration($paths);
    $dbParams = array('driver' => 'pdo_sqlite', 'memory' => true);
    $entityManager = EntityManager::create($dbParams, $config);
    je pourrais le créer comme ça et le fournir aux controllers via un event_listener qui serait attacher à l'event kernel.request. Je dois lui donner le chemin des entités donc je devrais pouvoir utiliser l'ORM comme je veux non?

    Le problème de ça c'est que j'ai pour le moment une erreur qui me dit:

    Class "App\Entity\Member" is not a valid entity or mapped super class.

    Après recherche j'ai trouvé sur un forum quelqu'un qui conseil de mettre un paramètre a false dans la méthode suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode, null, null, false);
    Et je n'ai plus l'erreur mais une autre qui est

    Argument 1 passed to App\Repository\MemberRepository::__construct() must be an instance of Symfony\Bridge\Doctrine\RegistryInterface, instance of Doctrine\ORM\EntityManager given, called in /Users/Jeje/Sites/Project/Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Repository/DefaultRepositoryFactory.php on line 68

    Qu'est ce que tu en penses? Est ce que cette piste est déjà une bonne piste et si oui comment je peux résoudre les deux erreurs correctement?

    Merci à toi pour ton aide

    PS: dans mon cas les entités sont toutes les mêmes d'une base de données à l'autre je suppose que je dois juste spécifier le même chemin dans la config à chaque fois?

    PS2: si j'utilise l'option wrapper_class dans le fichier de configuration et que je défini l'authentification moi même est ce que je ne règlerais pas le problème?

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Par défaut
    - Mettre le dernier paramètre à false signifie que l'annotation "@ORM\Entity" est reconnue; à true c'est "@Entity" qui est reconnue.

    - Vu que tu devras utiliser le conteneur comme un service locator - $this->getDoctrine()->getManager('database_XXX'), ça risque d'être lourd en effet mais pour être certain il faut profiler.

    - Pour le 2e problème, désolé je tourne en rond là-dessus et ne trouve pas de solutions (ou même de piste).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. CONNECTION ODBC avec DB POSTGRE
    Par wallior dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 01/08/2005, 16h59
  2. connection SYS avec oracle10g
    Par matana dans le forum Oracle
    Réponses: 4
    Dernier message: 02/06/2005, 17h55
  3. connection postgresl avec asp + pilote odbc
    Par tony_montana dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 26/01/2005, 16h25
  4. Réponses: 1
    Dernier message: 24/08/2004, 18h10
  5. Connection ADSL avec un routeur
    Par SebCBien dans le forum Réseau
    Réponses: 18
    Dernier message: 14/08/2004, 18h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo