Je možné kombinovať @inject v komentrároch a injekt cez konštruktor?

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

Zdravím,
mám v aplikácii viac druhov keše pre rozne moduly. Ako jediný spôsob ktorý ma napadol, ako jednotlivé keše dostať do presenterov je cez neon anotáciu napr.

AclBasePresenter: Acl\Presenters\BasePresenter(@aclCache)
FrontBasePresenter: Front\Presenters\BasePresenter(@frontCache)

Lenže tie presentery majú kopec ďalších závislostí a chcel by som sa vyhnúť tomu, aby sa všetky museli injektorať cez konštruktor. Jednak by som to musel prepisovať a aj to otrasne vyzerá.
Je možné použiť kombináciu @inject a konštruktora? napr.

namespace Acl\Presenters

use Acl;

class BasePresenter
{

	/** @var Acl\AclService @inject */
	public $aclService

	/** @var Nette\Caching\Cache */
	public $cache;

	public function __construct( Nette\Caching\Cache $aclCache )
	{
		$this->cache = $aclCache;

	...

Aby sa niektoré závislosti injektli cez @inject a tá cache cez neon a konštruktor. Dá so to nejako elegantne vyriešiť?

Editoval Čamo (15. 7. 2016 21:53)

blaztar
Člen | 93
+
0
-

Co ti na tom nefunguje? Ten config tam je navíc teda asi.

Čamo
Člen | 798
+
0
-

Ešte som to neskúšal. Len sa na to pripravujem. Takže by to malo fungovať?

blaztar
Člen | 93
+
0
-

Mělo (dokumentace)

CZechBoY
Člen | 3608
+
0
-

Co cachujes vlastne v presenteru? Ja cachuju bud v modelu nebo v sablone.

Jinak muzes pouzit setup a manualne nainjectovat/nasetovat sluzbu.

Editoval CZechBoY (15. 7. 2016 22:16)

Čamo
Člen | 798
+
0
-

A ako si to myslel s tým configom navíc? Ako určím v konštruktore, ktorú cache mám na mysli?

Čamo
Člen | 798
+
0
-

Vie prosím vás niekto čo znamená chyba:
Service ‚application.1‘: Multiple services of type Nette\Caching\Cache found:

Pred tým mi to hádzalo:
Service ‚86_ACL_PermissionFormFactory‘: Multiple services of type Nette\Caching\Cache found:

Z toho som videl kde mám chybu. Ale čo je application.1?

Čamo
Člen | 798
+
0
-

Tak teda nechápem. Mám presenter

/** @var \Nette\Caching\Cache */
protected $cache;


	public function __construct( Nette\Caching\Cache $aclCache )
	{
		parent::__construct();
		$this->cache = $aclCache;
	}

a v neone mám k tomu presenteru

	- App\AclModule\Presenters\AclBasePresenter( @aclCache )

Ale vyhadzuje mi to error: Nette\DI\ServiceCreationException

Service ‚application.1‘: Multiple services of type Nette\Caching\Cache found: aclCache, campaignsCache, cacheDatasource, cacheGeneralRepo, cacheOptionsProvider

Keď konštruktor zruším tak to kvázy funguje.

Editoval Čamo (15. 7. 2016 23:33)

GEpic
Člen | 566
+
+2
-

Čamo napsal(a):

Tak teda nechápem. Mám presenter

/** @var \Nette\Caching\Cache */
protected $cache;


	public function __construct( Nette\Caching\Cache $aclCache )
	{
		parent::__construct();
		$this->cache = $aclCache;
	}

a v neone mám k tomu presenteru

	- App\AclModule\Presenters\AclBasePresenter( @aclCache )

Ale vyhadzuje mi to error: Nette\DI\ServiceCreationException

Service ‚application.1‘: Multiple services of type Nette\Caching\Cache found: aclCache, campaignsCache, cacheDatasource, cacheGeneralRepo, cacheOptionsProvider

Keď konštruktor zruším tak to kvázy funguje.

Jasně, protože když tam ten konstruktor je, tak DI neví, co přesně ti tam dohodit (už neřeší config). A proto to hází chybu s multiple services, protože jich je (Nette\Caching\Cache) prostě v tu chvíli v DI víc. Kdežto když ten konstruktor smažeš, tak máš jasně v configu nadefinováno, kterou službu tam šoupnout.

Nevím, využíváme modulární aplikace celkem často, aplikace se skládá i ze sedmi / osmi modulů a presentery využíváme velice zřídka. Na veškeré cachování stačí jedna služba a tu využíváme všude. Jediné co je potřeba si ujasnit, jsou jména pro FileStorage, aby se to nemíchalo. Podle mě je zbytečné používat víc služeb Cache, však tu práci udělají tak nebo tak a žádný kladný výsledek (ať už z pohledu programátorského nebo výkonu) to nemá.

Jak píše @CZechBoY , v Presenteru už by se nic cachovat / načítat z cache nemělo.

EDIT:
Dle mého si tímto do budoucna zaděláš na dost problémů se závislostmi.

Editoval GEpic (16. 7. 2016 3:05)

Čamo
Člen | 798
+
0
-

GEpic: Díky, to už dáva zmysel. Problém je v tom, že toto je už dosť starý projekt a v presenteroch je kopa logiky, ktorá tam už bola. Nakoniec som tie presentery vyčistil a dal tu cache do modelu…