Názvy služeb Dependency Injection Containeru

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Filip Procházka
Moderator | 4668
+
0
-

V současné implementaci je možné jako název služby použít pouze to, co zchroustá PHP v názvu metody, čili písmenka, čísla a podtržítko.

Já a určitě nejenom já, mám nutkavou potřebu všechno kategorizovat. Teď ji ve mě ještě podpořilo Symfony DIC, které jsem pár týdnů používal. Tam je naming convention následující:

Služba se jmenuje http.request_factory a když se dumpne container, převede se na obdobu tohoto createServiceHttp_requestFactory(). Když container hledá službuhttp.request_factory, tak hledá metodu createServiceHttp_requestFactory()

Takže teď chci podpořit svoji úchylku v Nette a kategorizovat si svoje služby. Ovšem název služby http_requestFactory se mi vůbec nelíbí :(

  • Jaký je doporučovaný naming-convention pro chronické škatulkovače, Davide?
  • Můžu nějak přispět, aby se daly služby pojmenovávat i s tečkou? Třeba pull requestem?

Editoval HosipLan (20. 12. 2011 15:24)

David Grudl
Nette Core | 8227
+
0
-

Chtěl jsem udělat to, že když v konfigu bude:

http:
	services:
		requestFactory: ...

Vyrobí to službu (buď) http_requestFactory nebo httpRequestFactory (ale asi spíš s podtržítkem). Což je zkratka pro rozšíření, aby nemusela vše prefixovat. Tudíž i mimo rozšíření bych použil prefix:

services:
	http_requestFactory: ...
	# případně httpRequestFactory:

Čemuž bude odpovídat název metody a bude možné psát $container->http_RequestFactory. Lze to IMHO krásně řešit i bez teček.

(Tečka by byla fajn, kdyby se i služba volala skrz $container->http->requestFactory, což byl původní záměr, ale implementačně šíleně náročný, tak na to kašlu.)

Patrik Votoček
Člen | 2221
+
0
-

A co trochu „zneužít“ tagy?

services:
	cacheStorage:
		class: ...
		tags: [cache]
	templateCacheStorage:
		class: ...
		tags: [cache]
$container->cache->cacheStorage;
Honza Marek
Člen | 1664
+
0
-

David Grudl napsal(a):

Chtěl jsem udělat to, že když v konfigu bude:

http:
	services:
		requestFactory: ...

Jak bys poznal sekci, která něco dělá (services, includes, …) od té, která prefixuje? Výčtem? To je hloupé i proto, že by odpadla možnost rozšiřovat konfiguraci o další funkčnost. Tohle je celkem pěkné v Symfony – každou takovou top-level sekci má na starosti některé rozšíření a to pak nějakou jednoduchou konfiguraci přechroustá na něco velkolepého při kompilaci kontejneru.

David Grudl
Nette Core | 8227
+
0
-

Honza Marek napsal(a):

Jak bys poznal sekci, která něco dělá

To jsme si nerozuměli, každá sekce něco dělá. Píšu jen o tom, jak by se mohly prefixovat její vnitřní služby.

Filip Procházka
Moderator | 4668
+
0
-

Předtím bylo

http:
	...

teď je

parameters:
	http:
		...

Kdyby to bylo jako původní, mohlo by to mít dvě výchozí sekce parameters a services. Takhle jsi to myslel Davide?

@**Honza Marek**: Už to má i Nette :)

Patrik Votoček
Člen | 2221
+
0
-

@HosipLan: myslím že to myslel tak že by existovaly kontainery na služby (předpokládám symulaci subkontejnerů nad hlavním kontejnerem).

Filip Procházka
Moderator | 4668
+
0
-

Subcontainery jsou hrozné zlo. Porušují ti „plochou mapu ‚služba/třída => definice‘“ a musíš dohledávat v různém zanoření a vůbec to strašně komplikuje doplňování služeb. Zbytečné.

Patrik Votoček
Člen | 2221
+
0
-

Mě to neříkej. Já jsem ten kdo ti to říkal ještě když jsi je používal. :-)

Jen jsem vysvětloval wo co go…

Filip Procházka
Moderator | 4668
+
0
-

A taky jsi ten, od koho jsem si ten nápad vypůjčil :)
Ale tak jsi byl o pár týdnů napřed s používáním i uvědoměním ;)

David Grudl
Nette Core | 8227
+
0
-

Tak tak, subkontejnery jsou opruz a porušují DI ;-) Jde stále o jeden kontejner a syntaktickou záležitost.