Jak na @inject do presenteru, když mám víc služeb/instancí jedné třídy
- Jakub Bouček
- Člen | 54
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 | 8228
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
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 | 2664
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
Udělal bych to raději přes konfiguraci
services:
-
class: App\MyCustomPresenter
setup:
- $service3(@invoiceStorage)