Dependency Injection ve 2.1: Klíč factory v konfigurátoru

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Grudl
Nette Core | 8111
+
0
-

(Vyčleněno ze staršího příspěvku)

Ne zcela srozumitelný může být klíč factory v definici služeb, ještě hůře v definici továrniček:

services:
	authorizator:
		create: App\Authorizator(...)

factories:
	latte:
		create: Nette\Latte\Engine
		implement: ILatteFactory

Stálo by za zvážení jej změnit třeba na create: (tj. držet se popisu pomocí sloves create, setup, implement namísto podstatným jmen factory, methods*, interface).

services:
	authorizator:
		create: App\Authorizator(...)

factories:
	latte:
		create: Nette\Latte\Engine
		implement: ILatteFactory

(Poznámka: create používat jako alias pro factory už lze, bavím se spíš o best practices)

hrach
Člen | 1834
+
0
-

Super, konecne to chapu. Urcite prejmenovat :))

enumag
Člen | 2118
+
0
-

@hrach: Gratuluji, já si teď uvědomil, že to nechápu.

V dokumentaci je tento příklad:

services:
    database:
        class: Nette\Database\Connection
        create: DbFactory::createConnection

To je celkem jasné, Connection bude vytvořeno statickou metodou DbFactory::createConnection. Ale co proboha ten klíč factory: udělá když mu nedám metodu, ale třídu? Přejmenování na create mi nepomáhá, stále nechápu význam. Jaký je rozdíl mezi:

services:
    authorizator:
        create: App\Authorizator(...)

a

services:
    authorizator:
        class: App\Authorizator(...)

?

Aurielle
Člen | 1281
+
0
-

@enumag: pleteš do sebe dvě trošku odlišné věci (říkám to teoreticky, sám to taky nemám vyzkoušené). Důležité je tam to implement, což značí DIC továrničku. HosipLan to pěkně vysvětloval na Planette.

castamir
Člen | 629
+
0
-

@Aurielle jsem asi slepý, ale v příkladu od @hosiplana nevidím to create / factory… přidávám se k @enumag, taky nějak nechápu, jaký to factory / create má význam

David Grudl
Nette Core | 8111
+
0
-

class říká, co továrna vrací. Pokud je to jakkoliv detekovatelné, nemusí se uvádět. class: App\Authorizator(...) je tedy špatně.

pekelnik
Člen | 462
+
0
-

Heh ;) tohle už se řešilo … myslím že konečný konsensus byl super! Určitě přejmenovat.