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 :

Changer instance BD utilisée


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2004
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2004
    Messages : 151
    Par défaut Changer instance BD utilisée
    Bonjour,

    J'ai une petite question un peu technique.

    J'aurais besoin, au sein d'un projet, de changer l'instance d'une base de données stockée dans le sfContext.

    Actuellement, symfony se connecte tout seul à notre BDD puis crée une instance et la met dans le sfContext, ce qui rend cette variable accessible partout dans le code.

    Est-il possible de dire à symfony : "bon, on utilise plus telle BDD mais une autre et la ranger à la place de l'autre dans le sfContext ?

    J'espère avoir été clair.

    Cordialement,

    Axel

  2. #2
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    En fait, oui et non, mais et encore !

    Donc sfContext permet d'accéder au database manager qui lui permet de recréer, à chaque demande, une connexion vers la base de données.

    Maintenant que j'ai coupé le cheveux en 4 (dans le sens de la longueur), si tu expliquais clairement ce que tu souhaites mettre en œuvre ?

    Pourquoi veux-tu changer de connexion, à quel occasion, dans une même session ? pour un même utilisateur ? avec des liaisons entre tables d'une et de l'autre connexion ?

    Après, on va trouver une solution.

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2004
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2004
    Messages : 151
    Par défaut
    ReBonjour,

    Tout d'abord merci pour ta réponse rapide et claire

    La raison de ma question est simple :
    - nous créons un extranet qui permet de piloter plusieurs sites (qui sont tous des réplications les uns des autres).

    - je voudrais donc que à la connexion (voir pendant la session utilisateur), il soit possible de dire "je me connecte dorénavant à tel site". Le tout à l'aide d'une petite liste déroulante contenant la liste des sites.

    Merci d'avance pour ta réponse

    Petit rajout :
    Je suis le 2e développeur sur le projet.
    La classe qui se connecte à nos BDD et qui étend sfDatabase possède une méthode connect :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    public function connect()
    	{
    		$dsn = $this->getParameter('dsn');
    		if ($dsn == null) {
    			// missing required dsn parameter
    			throw new sfDatabaseException('Database configuration specifies method "dsn", but is missing dsn parameter.');
    		}
     
    		try {
    			$username = $this->getParameter('username');
    			$password = $this->getParameter('password');
    			$persistent = $this->getParameter('persistent');
     
    			$options = ($persistent) ? array(PDO::ATTR_PERSISTENT => true) : array();
     
    			$this->connection = new PDO($dsn, $username, $password, $options);
     
    			// encoding
    			$encoding = $this->getParameter('encoding', 'latin1');
    			$this->connection->exec('SET NAMES '.$encoding);
    		}
    		catch (PDOException $e) {
    	 		throw new sfDatabaseException($e->getMessage());
    		}
     
    		// lets generate exceptions instead of silent failures
    		//~ if ( sfConfig::get('sf_debug') ) {
    			$this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    		//~ }
    		//~ else {
    			//~ $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
    		//~ }
     
    		// compatability
    		if ( $this->getParameter('compat') ) {
    			$this->connection->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL);
    		}
     
    		// nulls
    		if ( $this->getParameter('nulls') ) {
    			$this->connection->setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_EMPTY_STRING);
    		}
     
    		// auto commit
    		if ( $this->getParameter('autocommit') ) {
    			$this->connection->setAttribute(PDO::ATTR_AUTOCOMMIT, true);
    		}
     
    		$this->resource = $this->connection;
    	}
    Est-il possible de faire qqch comme ca (d'après ce que tu dis ?) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $dbManager = sfContext::getDatabaseManager();
    $sfDatabase = new myPDODatabase();
    $sfDatabase->connect();
    $dbManager->setDatabase('cluster2',$sfDatabase);
    Sachant que "cluster" est un bloc défini dans databases.yml .
    J'ai juste un pb, je vois pas comment connect récupère le bon bloc du yml

  4. #4
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Attention ! Je n'ai jamais travaillé directement sur les objet sfDatabase et autres, ce que je vais écrire est issus de ma connaissance globale du symfony et de la lecture de la documentation. Cela devrait être vrai, mais je ne peux donner d'absolues garantie... Ceci dit, ma vision est :


    Je ne pense pas qu'il soit une bonne idée de définir toutes les connections dans le database.yml. Si tu fais cela, tu vas être obliger de les intégrer dans ton shema.yml et tu vas donc avoir une multitude d'objet du modèle identique qu'il faudra passer son temps à switcher et... inimaginable. Sans compter que pour rajouter un nouveau site...

    Non, je pense que le début de ta solution est bonne par contre.

    Il conviendrait de créer un minimum de deux connexions. La première, fixe, permettra essentiellement de définir quel est le site que le visiteur/utilisateur va vouloir utiliser, on y trouvera une table avec les paramètres de connexion (l'ajout d'un site sera ainsi largement plus simple), on peut aussi imaginer qu'elle va embarquer la partie initialisation. La deuxième sera une connection fantôme, elle va permettre de définir la structure du modèle (shema.yml) ainsi que les filter et form qui seront identique pour tous les sites. C'est la structure qui devra être dupliquée dans toutes les bases.

    Coté mise en œuvre, on va aller travailler le cœur de symfony.

    Créer un enfant de sfDatabaseManager qui va, suivant les demandes retourner la connexion vers la base de l'utilisateur (ou la base par défaut). Il faudra modifier le factories.yml pour lui indiquer le nouveau DatabaseManager utilisé (que symfony récupère votre objet depuis le sfContext.

    Je pense qu'il faudra spécifier le nom (ou l'id) (ou garder les paramètres de connexion) de la base dans une instance modifiée de l'objet sfUser.

    Ainsi, vous développer tranquille avec vos deux bases, il suffit de renseigner une table avec les paramètres de connexion pour les autres base dans la base de base (!) et les données dans le sfUserAVous peuvent être modifiées (par une méthode a créer) en cours de route pour changer de site. Accessoirement, vous pouvez lier la table des sites à celle des utilisateurs pour limiter les accès.

    Qu'en penses-tu ?

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2004
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2004
    Messages : 151
    Par défaut
    Alors je ne peux pas stocker mes informations de connexion en BDD.
    Je n'ai, en effet, pas de BDD rattachée au frontal web. Le frontal web se connecte aux bases pour afficher ses informations.

    En gros tu mets ton login / mdp / site et ca te connecte ...

    Il faudrait donc que je mette toutes mes bases dans un yml et que je crée un nouvel objet sfDatabaseManager enfant dudit objet de chez sf.

    Par contre impossible de trouver dans la doc SF comment "forcer" l'utilisation de ce petit enfant ^^

    Bref, même si je fais comme ca, je suis face à un problème :
    pour moi le sfDatabaseManager est appelé en début d'application (donc avant ma liste déroulante de sélection).

    De fait je ne peux pas le modifier à postériori ...

  6. #6
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Qu'est-ce qui empèche d'avoir une base de données de plus pour le frontal ?

    Si non, tu peux envisager de créer une table (array) avec les informations

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    array( 'connect1' => array('DSN => 'Mysql......',
                                        'name' = 'nompourlabase',
                                        'password' => 'lemotdepasse'
                                 ),
             'connect2' => array('DSN' => 'Mysqlautrebase',
                                ...
    Mais je reste convaincu que la création d'une base de données pour le frontal serait l'idéal.


    Il faut donc définir un site par défaut, soit le premier de la liste par exemple.

Discussions similaires

  1. cmt changer marktext, cmt utiliser OnGetMarkText
    Par tngtng dans le forum C++Builder
    Réponses: 0
    Dernier message: 21/12/2009, 10h18
  2. Réponses: 35
    Dernier message: 29/05/2006, 08h15
  3. Changer de base à l'intérieure d une instance dans un script
    Par Labienus dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 02/12/2005, 16h03
  4. [VB.NET] Composant utilisée pour changer donnée access
    Par moust dans le forum Windows Forms
    Réponses: 3
    Dernier message: 19/04/2005, 10h44
  5. Recupérer un argument et l'utiliser pour changer le bgcolor
    Par VincenzoR dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 11/01/2005, 20h23

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