autowired: no, inject:yes – upřesnění významu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Ivorius
Nette Blogger | 119
+
0
-
  1. Co přesně má za úkol v config.neon volba autowired:no ? Dle https://phpfashion.com/…na-nette-2-1 by se to mělo použít na ty třídy, které byli dříve zařazeny pod factories (a jestli tomu správně rozumím, tak to byly ty objekty, které se vždy při požadavku vytvářely znovu). Nicméně jsem už továrničky začal upravovat tak, aby to bylo v souladu s https://doc.nette.org/…s/form-reuse#… – staly se tedy z nich obyčejné služby, které mi přes create() vytváří nové požadované objekty.

Jak jsem ale vyrozuměl z dokumentace, tak autowired:no znamená – nepředávej tuto službu dál. V příkladu je uvedeno

services:
    cacheStorage:
        class: Nette\Caching\Storages\FileStorage(%tempDir%)

    tempCacheStorage:
        class: Nette\Caching\Storages\DevNullStorage
        autowired: no

Je to tedy určeno pouze pro služby, které požadují objekt implementující /* @return Nette\Caching\IStorage */ , těm se pak automaticky předá @cacheStorage?

Pokud bych v tom objektu chtěl přímo DevNullStorage, tak si ale stále mohu např. přes constructor injection vyžádat Nette\Caching\Storages\DevNullStorage $devNullStorage a bude to fungovat.

  1. inject:yes znamená, aby se službě samotné předávali závislosti např. přes @inject anotace, nebo inject metody. Pokud použiji constructor injection tak to nemusím uvádět?
  2. dá se v config.neon zapsat tyhle věci nějak zkráceně?

Funguje mi

		productManager:
			class: App\ProductManager
			inject: yes

dá se to zapsat i nějak ve smyslu - App\ProductManager -inject:yes -autowired:no ?

P.S. – asi by to chtělo aktualizovat část Továrny v https://doc.nette.org/cs/configuring

enumag
Člen | 2118
+
0
-

Pokud bych v tom objektu chtěl přímo DevNullStorage, tak si ale stále mohu např. přes constructor injection vyžádat Nette\Caching\Storages\DevNullStorage $devNullStorage a bude to fungovat.

Ne, nebude. Takové službě bys to musel předat explicitně:

services:
	devNullStorage:
		class: Nette\Caching\Storages\DevNullStorage
		autowired: no
	sluzba: Trida( @devNullStorage )

Autowiring zkrátka automatické přiřazování této služby jiným službám úplně vypne. Pokud ji někde potřebuješ, musíš ji vždy předat ručně.

inject:yes znamená, aby se službě samotné předávali závislosti např. přes @inject anotace, nebo inject metody. Pokud použiji constructor injection tak to nemusím uvádět?

Přesně tak. Doporučené je inject metody a anotace používat maximálně v presenterech.

dá se v config.neon zapsat tyhle věci nějak zkráceně?

Nedá. Pokud ti jde o to službu nepojmenovávat tak leda takhle:

services:
	-
		class: App\ProductManager
		inject: yes
Ivorius
Nette Blogger | 119
+
0
-

Super, díky za upřesnění.