Připojení k databázi na základě parametru v konzoli
- Petr Hudík
- Člen | 49
Ahoj,
v rámci jedné aplikace se připojuji k několika db. O tom, ke které db se připojím rozhoduje doména, velice zjednodušeně to vypadá takto:
<?php
namespace App;
class DatabaseConnectionFactory
{
private $request;
private $webs;
public __construct(Nette\Http\Request $request, $webs)
{
$this->request = $request;
$this->webs = $webs;
}
public function createDatabaseConnection()
{
$domain = $this->request->getUrl()->host;
if (isset($this->webs[$domain])) { // podmínky je samozřejmě složitější
$currentWeb = $this->webs[$domain];
return new Nette\Database\Connection('mysql:host=127.0.0.1;dbname=' . $currentWeb['name'], $currentWeb['use'], $currentWeb['password']);
} else {
throw new Exception(...); // pro danou doménu nedokážeme odpovídat
}
}
public function getDatabaseContext(Nette\Database\Connection $connection, \Nette\Database\Structure $structure)
{
return new Nette\Database\Context($connection, $structure);
}
}
?>
V config.neon mám pak jen jednoduché:
services:
databaseFactory: App\DatabaseFactory
- Nette\Database\Structure
databaseConnection:
class: Nette\Database\Connection
create: @databaseFactory::createDatabaseConnection
databaseContext:
class: Nette\Database\Context
create: @databaseFactory::getDatabaseContext
Toto řešení funguje dobře, problém nastane v okamžiku, kdy chci
pracovat v CLI pomocí Kdyby\Console. V okamžiku kdy je zavolán
Command::execute()
je samořejmě již služba
@databaseContext
načtena, takže zde nemohu změnit db, ke které
jsem připojený. Ale zároveň služba @databaseFactory
nemá
přístup k InputInterface
, abych db vybral tam.
Rád bych, aby to ke které databázi se připojím rozhodla
option
. Chtěl jsem se připojit k InputInterface a z něj danou
option vytáhnout, ale pokud tomu správně rozumím tak ArgvInput() vzniká až
v CliRouter,
což je pozdě – v té době již mám Db připojení mám.
Řešením by mohlo být prostě vytáhnout parametry z
$_SERVER['argv']
podobně jako např. zde:https://github.com/…rgvInput.php#L57
a pak je parsovat, ale líbí se mi myšlenka, že to šlo celé input, aby se
zobrazil parametr v nápovědě, přijímalo zkrácené parametry apod.
Jak tuto situaci řešit? parsovat parametry ručně? nebo nějak vytáhnout právě InputInterface? (a jak?) Díky za každý nápad.
Editoval Petr Hudík (27. 7. 2015 8:46)
- srigi
- Nette Blogger | 558
Ja riesim velmi podobnu vec – potrebujem nastavit DB spojenie podla ENV
parametrov, nie cez config.neon.
Zistil som, ze riesit to cez sluzby je neprakticke, je uz neskoro. Musis si
napisat vlastnu DI extension. Nie je to nic zlozite, odporucam inspirovat sa originalnou
NDB DI extension
Len nezabudat mazat cache po vybuildovani DIC, vtedy sa uz kod DI extension
nevykona.
- bazo
- Člen | 620
my tiez riesime nieco taketo.
v bootstrape si zistim o aku verziu ide – podla domeny, v .ini subore mam pre kazdu domenu priradenu verziu
podla tejto verzie nacitam prislusny config.neon napr sk.config.neon, kde su specificke nastavenia pre danu verziu
ovela jednoduchsie ako nejake extensiony a ine krkolomnosti