Replies: 2 comments
-
|
Hello, Désolé pour la réponse si tardive. <?php
return [
'application' => [
'dataSources' => [
// connexion à la première base
'db1' => 'mysql://login1:pwd1@localhost/base1',
// connexion à la seconde base
'db2' => 'mysql://login2:pwd2@localhost/base2',
],
],
];Dans une DAO, tout dépend de si tu écris une DAO custom, ou si tu utilises une DAO automatique. Pour une DAO custom, tu vas simplement utiliser l'une ou l'autre connexion dans le code : <?php
/** DAO de gestion des utilisateurs. */
class UserDao implement \Temma\Base\Loadable {
/** Connexion à la base de données. */
private \Temma\Datasource\Sql $_db;
/**
* Constructeur.
* @param \Temma\Base\Loader $loader Composant d'injection de dépendances.
*/
public function __construct(\Temma\Base\Loader $loader) {
// sélection de la source de données
$this->_db = $loader->dataSources->db1;
}
/**
* Retourne la liste des utilisateurs.
* @return array Liste de tableaux associatifs.
*/
public function getUsers() : array {
$sql = "...";
$users = $this->_db->queryAll($sql);
return $users;
}
}C'est donc la DAO qui choisit la base qu'elle utilise (ici Si par contre tu utilises une DAO créée automatiquement par Temma, c'est un peu différent. Elles attendent que la connexion à la BDD soit sous une datasource nommée " Dis-moi si tu veux creuser un peu plus dans une direction ou l'autre (DAO automatique ou DAO custom). |
Beta Was this translation helpful? Give feedback.
-
|
En réfléchissant, je pense mieux comprendre ton besoin. Dans ce cas, le plus simple est de créer un objet tout simple, en fournissant la connexion à la BDD en paramètre à son constructeur : <?php
/** DAO de gestion des utilisateurs. */
class UserDao {
/** Connexion à la base de données. */
private \Temma\Datasource\Sql $_db;
/**
* Constructeur.
* @param \Temma\Datasources\Sql $db Connexion à la base de données.
*/
public function __construct(\Temma\Datasources\Sql $db) {
// enregistrement de la source de données
$this->_db = $db;
}
/**
* Retourne la liste des utilisateurs.
* @return array Liste de tableaux associatifs.
*/
public function getUsers() : array {
$sql = "...";
$users = $this->_db->queryAll($sql);
return $users;
}
}Mais ça veut dire qu'il faut ajouter les instances explicitement dans le composant d'injection de dépendances. <?php
/** Contrôleur d'administration. */
class Admin extends \Temma\Web\Controller {
/** Méthode d'initialisation. */
public function __wakeup() {
// initialisation des DAO
$this->_loader->UserDaoABC = new UserDao($this->_loader->dataSources->db1);
$this->_loader->UserDaoXYZ = new UserDao($this->_loader->dataSources->db2);
}
/** Action qui affiche les utilisateurs. */
public function users() {
// récupération des utilisateurs de la première base
$users = $this->_loader->UserDaoABC->getUsers();
// ajout des utilisateurs de la deuxième base
$users = array_merge($users, $this->_loader->UserDaoXYZ->getUsers());
// ajout en variable de template
$this['users'] = $users;
}
}On peut imaginer avoir un pré-plugin qui initialise ça, pour rendre les instances disponibles pour tous les autres plugins et contrôleurs qui s'exécuteront par la suite. <?php
/** Plugin d'initialisation. */
class InitPlugin extends \Temma\Web\Plugin {
/** Méthode pré-plugin. */
public function preplugin() {
// initialisation des DAO
$this->_loader->UserDaoABC = new UserDao($this->_loader->dataSources->db1);
$this->_loader->UserDaoXYZ = new UserDao($this->_loader->dataSources->db2);
}
}Il faut juste ajout ce pré-plugin dans le fichier de configuration <?php
return [
'application' => [
'dataSources' => [
// connexion à la première base
'db1' => 'mysql://login1:pwd1@localhost/base1',
// connexion à la seconde base
'db2' => 'mysql://login2:pwd2@localhost/base2',
],
],
'plugins' => [
'_pre' => [
'InitPlugin',
],
],
];Ainsi, les deux DAO seront accessibles dans tous les contrôleurs. Par exemple : <?php
/** Contrôleur d'administration. */
class Admin extends \Temma\Web\Controller {
/** Action qui affiche les utilisateurs. */
public function users() {
// récupération des utilisateurs de la première base
$users = $this->_loader->UserDaoABC->getUsers();
// ajout des utilisateurs de la deuxième base
$users = array_merge($users, $this->_loader->UserDaoXYZ->getUsers());
// ajout en variable de template
$this['users'] = $users;
}
}Les deux DAO seront aussi accessibles à tous les objets qui ont accès au loader (le composant d'injection de dépendance). |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Bonjour,
J'ai une question au niveau des bases de données.
Est-il possible de mettre en place deux sources de données ( 2 MySQL ) et comment les appeler dans des DAO distinctes ?
En effet, je voudrais une base en lecture seul et une autre pour de l'écriture.
Merci par avance.
Beta Was this translation helpful? Give feedback.
All reactions