Dynamický počet databází v aplikaci, jde to řešit pomocí Nette?
- john.beee
- Člen | 3
Zdravím,
začal jsem se zajímat o Nette fw, ale narazil jsem na jednu možnost která je pro mě možná omezující:
Potřebuji vyvinout aplikaci – web, který pojede v podstatě pouze v lokální síti a který se připojuje k různým DB, jejichž počet se ale může v rámci jednotlivých instalací aplikace dynamicky měnit.
Pro lepší pochopení je to asi tak:
Franta má web ve kterém jsou informace z 5 okolních meteostanic, Jirka má v okolí pouze 2 metostanice atd.
Takže můj dotaz zní, je možné v Nette dosáhnout této dynamičnosti v definici a následném přístupu k DB ? Jde mi v podstatě o to, ať do kódu není potřeba zasahovat, ale ať je aplikace schopná zjistit aktuální počet databází ( to problém není) a je schopná se k nim připojit a provést nad nimi požadované dotazy.
Případně jakékoliv navedení na best-practice jak řešit podobný případ, velmi ocením :-)
Na závěr chci vyjádřit velký obdiv autorovi a komunitě okolo tohoto FW, hromada úspešné práce, jen tak dál :-)
Předem díky
- CZechBoY
- Člen | 3608
Já si předávám do repozitářů instanci třídy, která mi umí zajistit
databázi(pracuju jen s jednou v jednom repozitáři, jinak si může
uživatel vybrat třeba z X db). Tahle třída přijímá zvenku jen jakou
databázi má najít (nějakej identifikátor konkrétní databáze).
Nevim jestli zrovna tohle je i tvůj případ – nepíšeš jestli chceš
pracovat s jednou nebo všema dostupnýma db.
- john.beee
- Člen | 3
Děkuji za reakci, nemohl bys uvést nějaký obecný příklad kódu? Například v nějakém tutorialu ? O Nette si čtu cca 2 dny, takže hodně věcí mi ještě nepřešlo do krve.
V rámci jednoho zobrazení na monitoru (View jestli chápu správě terminologii) potřebuji zobrazit data pouze z jedné DB (default Meteo1). Po vybrání ( představa je button na který user klikne) stejná sada údajů z další meteostanice (Meteo2 atd.)
Jak do toho celého zapadá config.local.neon? Je zde potřeba hardcodovat jednotlivé DB nebo jde tento config upravit dynamicky ?
Omlouvám se za neznalosti, moje dotazy ti/Vám určitě příjdou úsměvné, možná hloupé…ale Nette je první framework ke kterému jsem se dostal, proto si chci vyjasnit jestli je možné v něm mojí představu realizovat, než se do studia ponořím hlouběji.
Díky
- CZechBoY
- Člen | 3608
Jo, takže máš to stejný jako já – někde nahoře si uživatel vybere
databázi z který chce data.
Všechny údaje k databázím mám v config.local.neon, pojmenované určitou
konvencí – třeba database123
, kdy 123
je id tý
databáze. Pak mám v db (která je jen jedna, já ji říkám webová db)
tabulku s jmény a id db.
V UserStorage si ukládám jakou db má zvolenou uživatel a pak ji nastavim do
aplikace, třeba v BasePresenteru/nějaký komponentě/rozšíření DIC –
záleží na tobě co se ti podaří.
No a v těch repozitářích si vyžádám nějakou službu, která mi teda
řekne jakou db použít – ve zkratce
abstract class BaseRepository
{
protected $db;
public function __construct(DbLocator $dbL)
{
$dbL->onServiceIdSet(function ($db) {
$this->db = $db;
});
}
}
Pak až někdo do toho DbLocatoru nastaví id db tak se vyvolá událost
onServiceIdSet
a nastaví se db ve všech repozitářích.
Editoval CZechBoY (29. 6. 2016 11:47)
- Martk
- Člen | 661
Předpokládám, že název databáze budeš mít uloženou v cookies nebo session:
class MeteoDatabase {
const
DEFAULT_DATABASE = 'default_meteo',
COOKIE_NAME = 'meteo_db';
private $db;
public function __construct(Request $request, array $databases) {
$name = $request->getCookie(self::COOKIE_NAME) ? : self::DEFAULT_DATABASE;
if (!isset($databases[$name])) {
// default database nebo exception
}
// ...
}
public function getDb() {}
}
abstract class BaseRepository {
public function __construct(MeteoDatabase $db) {
$this->db = $db->getDb();
}
}
Můžeš ještě MeteoDatabase rozšířit o Nette\Database\Context, ale když nepoužíváš jen jednu instanci, tak musíš u všech vypnout autowiring kromě jednoho.