DI více service, které implementují jednu interface
- Oli
- Člen | 1215
Jde nějak injectnout službu, která implementuje interface? Ale těch služeb bych chtěl mít více. Konkrétně 2.
Myslel jsem si, že když nastavím autowired: false, tak to půjde, ale stejně to na mě řve, že se mu to nelíbí.
Konkrétně to chci pro cachovaný a necachovaný dotazy do databáze. Představoval jsem si to nějak tak, že když:
vypnu cache
tak se mě zaregistruje DomainRepository
jako služba.
class DomainRepository extends EntityRepository implements IDomainRepository {}
Zapnu cache
tak se mě DomainRepository
zaregistruje taky jako služba, ale
s autowired: false a zaregistruje se mi další třída
CachedDomainRepository
.
domain:
class: DomainRepository
autowired: false
- CachedDomainRepository(@domain)
class CachedDomainRepository implements IDomainRepository
{
/**
* @var Cache
*/
private $cache;
/**
* @var DomainRepository
*/
private $domainRepository;
public function __construct(IStorage $storage, DomainRepository $domainRepository)
{
$this->cache = new Cache($storage, 'domain');
$this->domainRepository = $domainRepository;
}
}
Otázky:
Jde to nějak?
Proč to na mě řve, že to implementují 2 služby, když jedna je
neautowirovaná?
Jak řešíte zapínání, vypínání cache vy?
Díky za tipy.
- Oli
- Člen | 1215
No protože chci cachovat dotazy do databáze :)
class DomainRepository extends EntityRepository implements IDomainRepository {
public function fetchBySomtething($something){
return $this->findOneBy(['something'=> $something]);
}
}
class CachedDomainRepository implements IDomainRepository
{
/**
* @var Cache
*/
private $cache;
/**
* @var DomainRepository
*/
private $domainRepository;
public function __construct(IStorage $storage, DomainRepository $domainRepository)
{
$this->cache = new Cache($storage, 'domain');
$this->domainRepository = $domainRepository;
}
public function fetchBySomtething($something){
return $this->cache->load($something, function(& $dependencies) use ($something) {
return $this->domainRepository->fetchBySomtething($something);
});
}
}
No a chci to mít možnost vypnout, nebo vypnout jen jednu extension nebo jen jeden repositar (to bych prehodil jen rucne)…
Je to blbost?
- Oli
- Člen | 1215
Hm. to by skoro šlo.
Ještě jsem teď narazil, že nejsem schopnej do repository si předat
cache. Ta repository je jako repository uvedena u entity. Já ji zaregistruju
jako službu a předají se jí závislosti. Problém je, že nevím jak se jí
ty závislosti předají, protože
Doctrine\Orm\Mapping\ClassMettadata
není zaregistrováno jako
služba, takže já nejsem schopnej v potomku EntityRepository použít
constructor. Zkoušel jsem to přes set metodu, ale to taky nešlo.
Na jaký úrovni to cachuješ, přímo v repository? Používáš
repositoryClass
u entity?
/**
* @ORM\Entity(repositoryClass="DomainRepository")
*/
class Domain
- Oli
- Člen | 1215
@DavidMatějka hláška vypadá takhle:
Service ‚134_Core_Nette_Managers_DomainManager‘: Multiple services of type Core\Entities\Domains\Repositories\IDomainRepository found: 140_Core_Entities_Domains_Repositories_DomainRepositoryDecorator, domainRepository
jak to mám v configu a jak vypadají ty třídy je v prvním postu.
Očekával bych, že DomainRepositoryDecorator
se bude normálně
autowirovat podle interface a DomainManager
se vloží jen tam, kam
ho vložím ručně.
Jen doplním tu třídu, která vyžaduje tu službu:
class DomainManager
{
public function __construct(
IDomainRepository $domainRepository,
Session $session,
Request $request,
DomainProvider $domainProvider
)
}
Editoval Oli (25. 11. 2016 15:24)
- Oli
- Člen | 1215
@DavidMatějka mám. jak jsem to různě zkoušel, tak jsem to domain
přejmenoval na domainRepository
.
Takže to teď vypadá takhle (respektive vypadalo, mám to zase jinak :-))
domainRepository:
class: Core\Entities\Domains\Repositories\DomainRepository
autowired: false
- Core\Entities\Domains\Repositories\DomainRepositoryDecorator(@domainRepository)
Nicméně tím to není.
- David Matějka
- Moderator | 6445
hm, ono to asi nebude kompatibilni s kdyby magii, ktera ty sluzby odebira a pak zas pridava… https://github.com/…xtension.php#L713