připojení do dvou databází
- Paradiso
- Člen | 101
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
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)
- raketoplan2005
- Člen | 147
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
Nijak, je to chyba návrhu aplikace.
- V Presenteru bys nikdy neměl pracovat přímo s databází (a už vůbec ne se dvěma), ale s modelem.
- Každá třída modelu by měla pracovat s nejvýše jedním databázovým připojením.
- Modely používající výchozí připojení ho dostanou skrz autowiring, modelům používající sekundární ho nastavíš v neonu.
- Do presenteru si můžeš injectnout kolik chceš modelů.
Editoval enumag (21. 3. 2013 23:37)
- Šaman
- Člen | 2665
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
@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
@raketoplan2005: jak pise @enumag, musis to nastavit v neonu, napr
services:
foo: Bar(@database2)
- raketoplan2005
- Člen | 147
A jo, dneska je super den. Díky všem, třeba to v budoucnu pomůže i někomu dalšímu.