Je možné kombinovať @inject v komentrároch a injekt cez konštruktor?
- Čamo
- Člen | 798
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)
- Čamo
- Člen | 798
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
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
Č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)