Připojení k databázi na základě parametru v konzoli

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

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

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

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

newPOPE
Člen | 648
+
0
-

Presne tak ako @bazo nakolko presne na to tie configy su.