Moznost pridat alias sluzby v konfiguraci
- xr
- Člen | 94
Ahoj,
Je nejaka moznost pridat alias sluzby v konfiguracii?
Nieco taketo:
<?php
//neon
services:
foo: My\Foo\Service
# alias
bar: @foo
?>
Vyssie uvedene je fajn a funguje, pokial nepouzivate dekoratory. Avsak pokial dekoratory pouzivate,
<?php
//neon
decorator:
My\Foo\Service:
setup:
- callFooSetup
?>
metoda callFooSetup
bude volana dvakrat,
pretoze vo vygenerovanom DI kontajneri createServiceBar
interne
vola createServiceFoo
, ale callFooSetup
volanie sa
nachadza v oboch metodach.
To ma neziaduce ucinky. Je mozne nejako pridat alias sluzby bez DI rozsirenia a uprav v PHP kode Nette? Diky!
Existuje ContainerBuilder::addAlias
metoda, ale je ju samozrejme
mozne volat len pocas vytvarania kontajneru v DI rozsireniach.
- David Grudl
- Nette Core | 8227
Ano, bar: @foo
není alias, ale vytvoření nové služby. Alias
lze přidat jen přes DI rozšíření.
- David Grudl
- Nette Core | 8227
A k čemu je to užitečné? U těch extensions to existuje jen z důvodu zpětné kompatibility, ale proč to dělat v konfigu nevím.
- xr
- Člen | 94
Robim nejaku magiu so sluzbami a potrebujem, aby pouzivali istu konvenciu nazvov. Zaroven vsak potrebujem, aby sa volali tak, ako boli povodne navrhnute (kvoli logickemu rozdeleniu). Je to zlozite na vysvetlenie.
Zjednodusene:
mam sluzbu logicky zaclenenu k nejakej casti aplikacie
moduleA.fooService
, ale zaroven chcem na rovnaku sluzbu pristupit
aj pomocou featureA.fooService
, inak povedane, sluzbu potrebujem
logicky zadelit do dalsej skupiny.
Chapem, ze je to okrajovy pripad.
Ak chces podotknut, ze aj tak nie je vhodne na sluzby pristupovat pomocou nazvu (vzhladom na princip DI), tak mas pravdu, ale potrebujem to z dovodu cyklickych zavislosti a poziadavku na „lazy loading“ sluzieb.
- xr
- Člen | 94
Tak vytvoril som trivialne dedikovane DI rozsirenie, pre referenciu ho sem pastujem:
<?php
class AliasDiExtension extends Nette\DI\CompilerExtension
{
public function loadConfiguration()
{
$builder = $this->getContainerBuilder();
foreach ((array) $this->config as $alias => $serviceName) {
$builder->addAlias($alias, $serviceName);
}
}
}
?>
Takto je mozne vytvorit v neone konf s aliasmi:
<?php
alias:
bar: foo
myAlias: myService
?>