Dynamický počet databází v aplikaci, jde to řešit pomocí Nette?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
john.beee
Člen | 3
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
+1
-

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.

CZechBoY
Člen | 3608
+
0
-

@Antik hm, to vypadá taky dobře. Možná použiju tvůj způsob zjištění daabáze :-)
Díky

potapnik
Člen | 127
+
+2
-

Databaze v cookie mi prijde jako masivni potencialni bezpecnostni dira, v session je to o dost lepsi :)

Editoval potapnik (29. 6. 2016 13:54)

john.beee
Člen | 3
+
0
-

Pánové díky za podnětné rady.