Přístup k jiné databázy z presenteru

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

Zdravím, nikde jsem to tu nenašel tak píšu sem.

Když používám 2+ databází, tak:

  1. Jak to mám zapsat v configu?

    Momentálně:

	nette:
		database:
			dsn: 'mysql:host=localhost;dbname=xxx'
			user: 'xxx'
			password: 'xxx'
  1. Jak k nim přistupovat v presenteru

    Něco na způsob:

    if(x == y) mysql_select_db('druha_databaze');

Díky, spix

Editoval spix (27. 11. 2012 14:05)

leninzprahy
Člen | 150
+
0
-

v cofigu to může vypadat třeba takhle

common:

	parameters:
		database:
			default:
				driver: mysql
				host: *****
				dbname: *****
				user: *****
				password: *****
			druha:
				driver: mysql
				host: *****
				dbname: *****
				user: *****
				password: *****
	nette:
		database:
			default:
				dsn: '%database.default.driver%:host=%database.default.host%;dbname=%database.default.dbname%'
				user: %database.default.user%
				password: %database.default.password%
			druha:
				dsn: '%database.druha.driver%:host=%database.druha.host%;dbname=%database.druha.dbname%'
				user: %database.druha.user%
				password: %database.druha.password%

	services:
		defaultDb: @nette.database.default
		druhaDb: @nette.database.druha

v presenteru pak

	$this->getContext()->defaultDb->table....

	$this->getContext()->druhaDb->table....

pokud by jsi to chtěl injectovat, bylo by potřeba na to napsat továrnu, v tom případě ale záleží, kterou verzi nette používáš, protože se to teď mění/vyvíjí

enumag
Člen | 2118
+
0
-

Dodám, že $this->getContext() bys neměl používat, takže je lepší si v configu zaregistrovat ještě nějaký model, kterému předáš @nette.database.druha jako Connection a tento model si pak injectneš do presenteru. Problém tohoto postupu je, že to připojení není lazy.

mkoubik
Člen | 728
+
0
-

A používat connection přímo v presenteru, pokud neděláš opravdu triviální věc, taky není moc OK.

leninzprahy
Člen | 150
+
0
-

nechtěl jsem to zbytečně komplikovat, když

spix napsal(a):

  1. Jak k nim přistupovat v presenteru

    Něco na způsob:

    if(x == y) mysql_select_db('druha_databaze');

:)

spix
Člen | 7
+
0
-

Díky všem, zkusím ještě to co tu navrhoval enumag, díky

mildabre
Člen | 62
+
0
-

enumag napsal(a):

Dodám, že $this->getContext() bys neměl používat, takže je lepší si v configu zaregistrovat ještě nějaký model, kterému předáš @nette.database.druha jako Connection a tento model si pak injectneš do presenteru. Problém tohoto postupu je, že to připojení není lazy.

V tutoriálu pro začátečníky Nette je v každém presenteru použit právě ten $this->context pro deklarování závislostí presenteru ze služeb v configu takže bych Tě chtěl požádat, zda by Jsi Ty či někdo jiný blíže nevysvětlil jak to bylo míněno, že by se nemělo používat $this->getContext().

Editoval mildabre (11. 12. 2012 21:05)

enumag
Člen | 2118
+
0
-

Aha, koukám že v tutoriálu to ještě nikdo neupravil. :-( Správně je to takhle.

EDIT: $this->context se nemá používat protože se jedná o service locator a závislosti nejsou viditelné bez čtení celého kódu.

Editoval enumag (11. 12. 2012 21:10)