Změna aktivní databáze za běhu aplikace
- Pipaslot
- Člen | 19
Zdravím,
navrhuji aplikaci s centrální databází a s údaji o uživatelích(a
podrobnostech o systému). Avšak potřebuju aby po přihlášení se
uživatele do aplikace (kontrolou informací v centrální DB) se změnila
využívaná databáze. Samozřejmě s tím souvisí i vytváření
neexistujících databází a tabulek.
Nemáte někdo představu, jak se dá za běhu pouze zaměnit databáze, pro
klasickou práci v modelech?
Díky za Vaše rady.
- vvoody
- Člen | 910
Ja by som vytvoril dve sluzby. Prvu ‚centralDatabase‘ v configu a druhu ‚database‘ (alebo mozno ‚personalDatabase‘:)) niekde v basePresenteri po overeni prihlasenia. $this->context->addService(), to uz ale asi nepojde autowiring takze treba v configu napriklad pri modeloch odkazovat cez @centralDatabase a @database.
- Pipaslot
- Člen | 19
Našel jsem zatím řešení vytvořením rodičovského modelu, který v konstruktoru vytvoří uživateli databázi(pokud neexistuje) a vytvoří spojení s databází. Na toto spojení se dá později odkazovat a vše zatím funguje podle představ.
function __construct(\Nette\Database\Connection $edb, \Nette\Security\User $user, \Nette\DI\IContainer $container)
{
$this->editorDB = $edb;
$this->user = $user;
$this->dbName = $this->user->getIdentity()->database;
/*
* Vytvoření databáze uživatele před jejím připojením
*/
try{
$this->editorDB->query("CREATE DATABASE ".$this->dbName." DEFAULT CHARACTER SET utf8 COLLATE utf8_czech_ci");
}catch(Exception $e){
}
//Předání řízení databáze uživatelské databázi
$this->userDB = new Nette\Database\Connection(
$container->parameters['database']['driver'].':host='.$container->parameters['database']['host'].';dbname='.$this->user->getIdentity()->database,
$container->parameters['database']["user"],
$container->parameters['database']["password"]);
}