Hello,

Dans mon application j'utilise plusieurs bdd :

  • 1 bdd commune pour certains paramètres communs, les users, companies, etc...

  • Chaque company a donc sa propre bdd, le nom de la bdd de chaque company est stocké dans la table companies de la base commune.

  • Le login avec Auth se passe bien, mais je ne vois pas trop ensuite comment faire pour stocker la configuration de connexion à la bdd de la company de manière persistante. Le mieux serait que cette configuration soit effective pour toute la session de l'utilisateur.

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


amethyste
Réponse acceptée

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
Auteur
Réponse acceptée

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 !

essaie dans ton controlleur avec ca

$company = $this->Session->read('Auth.User.company');
$this->$company->find('All');