připojení do dvou databází

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

Ahoj, nedaří se mi nastavit config neon, tak abych měl připojení do 2 databází.

Respektivě, lze to udělat takto:

		database:
			class: Nette\Database\Connection
			arguments: ['mysql:host=%database.host%;dbname=%database.dbname%', '%database.user%', '%database.pass%']

		database2:
			class: Nette\Database\Connection
			arguments: ['mysql:host=%database2.host%;dbname=%database2.dbname%', '%database2.user%', '%database2.pass%']

ale to zase nemám dotazy v debug panelu

když jsem zkoušel toto tak se do instance database2 uloží údaje stejné jako v database

		database:
			default:
				dsn: '%database.engine%:host=%database.host%;dbname=%database.dbname%'
				user: %database.user%
				password: %database.pass%

		database2:
			default:
				dsn: '%database2.engine%:host=%database2.host%;dbname=%database2.dbname%'
				user: %database2.user%
				password: %database2.pass%



	services:
		database: @Nette\Database\Connection
		database2: @Nette\Database\Connection

když jsem zkusil kombinaci prvního a druhého (první db jsem chtěl mít v debugu a druhou ne, tak mi to vyhodilo Multiple services of type Nette\Database\Connection found: nette.database.default, database2

Jak to správně řešit? Děkuji

enumag
Člen | 2118
+
0
-
database:
    default:
        dsn: '%database.engine%:host=%database.host%;dbname=%database.dbname%'
        user: %database.user%
        password: %database.pass%

    second:
        dsn: '%database2.engine%:host=%database2.host%;dbname=%database2.dbname%'
        user: %database2.user%
        password: %database2.pass%

services:
    database: @nette.database.default
    database2: @nette.database.second

Editoval enumag (29. 1. 2013 18:04)

Paradiso
Člen | 101
+
0
-

díky moc, funguje

raketoplan2005
Člen | 147
+
0
-

Mám jen jeden presenter ve kterém potřebuji obě databáze, jak rozliším v inject metodě

injectConection(\Nette\Database\Connection $db)

která je která?

Díky

enumag
Člen | 2118
+
0
-

Nijak, je to chyba návrhu aplikace.

  1. V Presenteru bys nikdy neměl pracovat přímo s databází (a už vůbec ne se dvěma), ale s modelem.
  2. Každá třída modelu by měla pracovat s nejvýše jedním databázovým připojením.
  3. Modely používající výchozí připojení ho dostanou skrz autowiring, modelům používající sekundární ho nastavíš v neonu.
  4. Do presenteru si můžeš injectnout kolik chceš modelů.

Editoval enumag (21. 3. 2013 23:37)

Šaman
Člen | 2640
+
0
-

Injectne se ta, která v configu nemá nastaveno: „autowired: no“.
Pokud u žádné nevypneš autowirování, tak ti to napíše, že neví, kterou použít.
Viz dokumentace sekce Auto-wiring.

Editoval Šaman (21. 3. 2013 23:43)

raketoplan2005
Člen | 147
+
0
-

@enumag: Ano, jsem vážně hlupák, máš pravdu, vím že to tak nemá být a ani to tak dělat nechci a nedělám. Mám normálně model, ale už je asi pozdě a napsal jsem co jsem napsal :-)

Takže když to vezmu odznovu – hledám vlastně to co jsi napsal v bodě 3 a na co navádí i @Šaman, ale pořád mi není jasné jak v konstruktoru rozlišit které to připojení se vybere.

V odkazované dokumentaci chápu tu situaci tak, že když se vypne autowiring u jednoho typu, bere se automaticky ten co nemá vypnutý autowiring a když potřebuju ten druhý, řeknu si v konstruktotu přímo o objekt třídy DevNullStorage. Ale když jsou obě připojení ze stejné třídy a jen používají jinou databázi na stejném serveru?

David Matějka
Moderator | 6445
+
0
-

@raketoplan2005: jak pise @enumag, musis to nastavit v neonu, napr

services:
	foo: Bar(@database2)
raketoplan2005
Člen | 147
+
0
-

A jo, dneska je super den. Díky všem, třeba to v budoucnu pomůže i někomu dalšímu.