Connecter base de données au login

Par filopp, il y a 12 ans


Hello,

Dans mon application j'utilise plusieurs bdd :

Je pensais à stocker dans une variable le nom de la db et ajouter une fonction construct à l'AppModel pour charger la config de connexion lorsque c'est nécessaire, mais cela ne me parait pas très classe... D'autant plus que l'on va charger cette config beaucoup de fois alors qu'elle devrait rester la même pour toute la session d'un user.

Merci pour idées !

3 réponses

redkill2108, il y a 12 ans

essaie dans ton controlleur avec ca

$company = $this->Session->read('Auth.User.company');
$this->$company->find('All');
amethyste, il y a 12 ans

Un truc comme ça devrait faire l'affaire :

dans Config/database.php

class DATABASE_CONFIG {
    public $default = array(
        'datasource' => 'Database/Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'login' => 'root',
        'password' => '',
        'database' => 'table_commune',
        'prefix' => '',
        'encoding' => 'utf8',
        );

    public function __construct(){
        //recupère les infos de connexion
        $company = AuthComponent::user('Company');
        //ici il faudrait même tester que $company n'est pas vide
        //nouvelle config
        $companyDB = array(
            'login' => $company'login_companie'],
            'password' => $company'pass_companie'],
            'database' => $company'table_companie']
            );
        //chargement base
        $this->default = array_merge($this->default,$companyDB);
    }
}
filopp, il y a 12 ans

Merci. J'ai compilé certaines idées pour arriver à cette solution :
Dans le UsersController, au login on va écrire dans les données de session les infos dont nous avons besoin pour sélectionner la bdd client

public function login() {
    if ($this->request->is('post')) {
        if ($this->Auth->login()) {
            $this->User->id = $this->Auth->User('id');
            // On sauvegarde date et heure de connexion
            $this->User->saveField('lastlogin', date("Y-m-d H:i:s"), array('callbacks' => 'false'));
            if (isset($_SESSION'Auth']'User']'Company']'db'])) {
                // On a besoin de l'id de la compagnie, le nom de sa db et de son nom pour d'autres fonction dans l'appli
                $this->Session->write('user.companyDB', $_SESSION'Auth']'User']'Company']'db']); // Pour la configuration du choix la bdd (données client)
                $this->Session->write('user.companyId', $_SESSION'Auth']'User']'company_id']); // nécessaire pour certains enregistrements
                etc...

De cette manière ces données sont accessibles partout dans l'appli et sont stockèes aussi en bdd pour éviter les problèmes de perte de données de session.

Ensuite dans l'appModel on ajoute ce bout de code pour sélectionner au besoin la bonne bdd :

// On lance un construct pour charger la connexion à la bdd de la compagnie
    function __construct($id = false, $table = null, $ds = null) {
        // Si le modèle demandé appartient à la compagnie 
        if ($this->useDbConfig == 'defaultCompany') {
            // ON vérifie qu'il n'a pas déjà été instancié
            if (!in_array('defaultCompany', ConnectionManager::sourceList())) {
                // On charge les données de session
                App::uses('CakeSession', 'Model/Datasource');
                $db = CakeSession::read('user.companyDB');

                ConnectionManager::create ('defaultCompany', array(
                        'datasource' => 'Database/Mysql',
                        'persistent' => false,
                        'host' => 'localhost',
                        'login' => 'login',
                        'password' => 'password',
                        'database' => $db,
                        'encoding' => 'utf8')
                );
            }
        }
        parent::__construct($id, $table, $ds);
    }

Avec ça, j'arrive exactement à faire ce que je voulais, après ce n'est peut être pas la solution la plus élégante mais elle me convient. Toute remarque bienvenue !