Jak autowirenout pojmenovanou službu podle rodiče?

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

Zdravím,
mám dva typy modelů a k nim dva typy databáze – datová a webová.
Aktuálně mám víc modelů používajících datovou databázi takže mám nastavený autowire na dataovou databázi. V případě webových modelů si ručně předávám službu:

services:
  - NS\MyWebModel(@database.webConn.context) # model s pristupem do webove db
  - NS\MyDataModel # model s pristupem do datove db

Tyto modely se také liší tím, že dědí od BaseModel, resp. BaseWebModel.

Lze tedy nějak (jak?) pomocí rodiče určit jaká služba (databáze) se má použít?
Díky

David Matějka
Moderator | 6445
+
0
-

Nyni to neni mozne, musel by sis napsat vlastni extension. Ale asi by nebyl problem pridat podporu do dekoratoru, aby se nechaly uvest arguments, takze by zapis mohl vypadat treba takhle:

decorator:
	BaseWebModel:
		arguments: [connection: @database.webConn.context]
CZechBoY
Člen | 3608
+
0
-

@DavidMatějka: buď jsem to nepochopil, nebo špatně přepsal :(

decorator:
    NS\BaseWebModel:
        arguments: [db: @database.webConn.context]

Takhle to je dobře nebo špatně?
Dostávám exception

Nette\InvalidStateException

Unknown configuration option decorator.NS\BaseWebModel.arguments.

Editoval CZechBoY (13. 10. 2015 17:45)

David Matějka
Moderator | 6445
+
0
-

precti si ten prispevek znovu :) pisu, ze to zatim neni mozne, ale ze by asi nebyl problem pridat podporu do dekoratoru

CZechBoY
Člen | 3608
+
0
-

@DavidMatějka: Jj, asi to nastuduju.
Takže vezmu všechny služby typu BaseWebModel a přidám jim tam parametr webConn jako první.
To by mělo být ok.
Díky

newPOPE
Člen | 648
+
0
-

Neslo by to urobit tak, ze si namiesto toho aby si to musel vypisovat vyrobil 2 classy pre DB connections a na zaklade toho by malo DI ficat. Ide mi len o to aby si to nemusel vypisovat v configu…

CZechBoY
Člen | 3608
+
0
-

@newPOPE
Jak to myslíš?
Udělat potomka DbContextu a ten potom do webConn?
To bych asi musel udělat WebDatabaseExtension pro tu službu, ne?

Editoval CZechBoY (14. 10. 2015 15:34)

newPOPE
Člen | 648
+
0
-

@CZechBoY neviem cije extension nutna. Ano cez potomka som myslel a nechas si injektnut priamo jeho.

CZechBoY
Člen | 3608
+
0
-

@newpope Můžeš hodit ukázku pls? Moc tě nechápu :(

newPOPE
Člen | 648
+
0
-

@CZechBoY

// config.neon
- FirstDbContext(...)
- SecondDbContext(...)
- FooService
- BarService

// Db context childs
class FirstDbContext extends \Nette\Db\Context {}
class SecondDbContext extends \Nette\Db\Context {}

// FooService
public function __construct (FirstDbContext) {...}

// BarService
public function __construct (SecondDbContext) {...}
CZechBoY
Člen | 3608
+
0
-

@newPOPE Myslim, že jsem něco přehlídl :-)). Díky za ukázku, už jsem to pochopil jak to myslíš.
Akorát jsem si uvědomil, že to asi nebude potřeba …
Webový modely maj v konstruktoru přímo DB\Context, datové modely mají DbResolver, který jim databázi dodá až potom, co bude vědět kterou dodat.

Nastavil jsem teda webovou databázi jako autowired=true, datové databáze mají autowired=false.

Při druhé (nechápu proč ne při první) službě využívající Db\Context mi Nette vyhodí BSOD, že nemůže najít Db\Context službu.

Neví někdo čím by to mohlo být?

database:
	webConn:
		dsn: ...
		user: ...
		password: ...
		autowired: true

Editoval CZechBoY (24. 11. 2015 13:07)