Jak na @inject do presenteru, když mám víc služeb/instancí jedné třídy

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

Ahoj, v dokumentaci a ve zbytu fóra jsem nenašel, jak volat službu jejím jménem. Všude se jako identifikátor dává název třídy, ale já mám služby dělané jako více instancí jedné třídy.

Příklad:

services:
	imageStorage: \Jakubboucek\StorageRouter\Static(%storage.image.conf%)
	videoStorage: \Jakubboucek\StorageRouter\Static(%storage.video.conf%)
	invoiceStorage: \Jakubboucek\StorageRouter\Static(%storage.invoice.conf%)

Ale v presenteru pak potřebuju použít danou službu, drív to šlo přes $this->getService('imageStorage');, ale nyní toto již není možné, musí se přes DI, ale kromě __construct(Static $configuredStorage), který není pro presenter vhodný, se všude služba definuje názvem třídy:

// 3) Předání do proměnné s anotací @inject:
/** @inject @var \App\Service3 */
public $service3;

Když použiju jako definici např.: invoiceStorage, tak to nefunguje.

Připadám si jako začátečník, který není schopnej překonat úplně banální úkol.

Prosím, jak můžu injectovat konkrétní službu, aniž bych musel použít konstruktor a nebo pro každou definovat vlastní továrničku (což mi pozbývá smyslu, protože jsou to identické funkce, jen každá s jinými argumenty (jiná cesta a jiné klíče).

David Grudl
Nette Core | 8136
+
+1
-

getService() by fungovat mělo, nefunguje? Jinak konkrétní služby, které potřebuješ předat do presenteru, můžeš uvést v konfigu, viz https://doc.nette.org/…dependencies#…. Pokud ti z nějakého důvodu nevyhovuje konstruktor, použij libovolnou jinou metodu a zavolej ji v sekci setup v definici služby.

Jakub Bouček
Člen | 54
+
0
-

David Grudl napsal(a):

getService() by fungovat mělo, nefunguje?

Nette\MemberAccessException: Call to undefined method App\Presenters\HomepagePresenter::getService(). in /var/www/hrackydomino.cz/vendor/nette/utils/src/Utils/ObjectMixin.php:100

Pokud ti z nějakého důvodu nevyhovuje konstruktor

Nevyhovuje mi protože pak BasePresenter nemá kompatibilní interface :-(

Jinak konkrétní služby, které potřebuješ předat do presenteru, můžeš uvést v konfigu, viz https://doc.nette.org/…dependencies#… (…) použij libovolnou jinou metodu a zavolej ji v sekci setup v definici služby.

Jo to by šlo, díky. Sice už je to trochu drbání a hlavně musím dávat bacha, abych v BasePresenteru neměl stejnou setup funkci.

Šaman
Člen | 2635
+
+2
-

Jakub Bouček napsal(a):

David Grudl napsal(a):

getService() by fungovat mělo, nefunguje?

Nette\MemberAccessException: Call to undefined method App\Presenters\HomepagePresenter::getService(). in /var/www/hrackydomino.cz/vendor/nette/utils/src/Utils/ObjectMixin.php:100

To getService() volej na DI kontejneru, nikoliv na presenteru.
Viz. https://api.nette.org/…ner.php.html#…

Filip Procházka
Moderator | 4668
+
+4
-

Udělal bych to raději přes konfiguraci

services:
	-
		class: App\MyCustomPresenter
		setup:
			- $service3(@invoiceStorage)