Ako ziskat instanciu anonymnej sluzby definovanej cez alias v neone
- duskohu
- Člen | 778
Caute, robim si rozsirenie, kroremu predam cez alias rozne anonymne sluzby :
services:
- WpTemplate\MyTemplate
extensions:
wpApplication: WpApplication\DI\WpApplicationExtension
wpApplication:
setup:
WpTemplate: @WpTemplate\MyTemplate
V DI containeru mi vygeneruje sluzbu 20_WpTemplate_WpTemplate: WpTemplate\WpTemplate
Potrebujem zistit ci sluzba implementuje clas, problem je ze neviem ziskat
sluzbu z containeru lebo je anonymna poznam len @WpTemplate\WpTemplate.
Neviete mi poradit ako to riesit? Ono uvazujem ze budem predavat aj neanonymne
sluzby cez alias, aj priamo definovane sluzby do parametra setup. Tieto varianty
si uz viem vyriesit, ale anonymnu sluzbu predavanu cez alias neviem.
Este chcem pridat v reale to overovabie robim az v beforeCompile, tu som to
dal koi prikladu priamo do loadConfiguration.
class WpApplicationExtension extends CompilerExtension
{
/** @var array */
public $defaults = array(
'setup' => array(),
)
public function loadConfiguration()
{
$builder = $this->getContainerBuilder();
$config = $this->getConfig($this->defaults);
$this->prepareServices($config['setup']);
}
protected function prepareServices($services)
{
$builder = $this->getContainerBuilder();
foreach ($services as $key => $class) {
if (Strings::startsWith($class, '@')) {
$class = substr($class, 1);
// v $key mam >> WpTemplate
// v $class mam >> WpTemplate\WpTemplate
// takze neviem ziskat getDefinition() kedze poznam len clasu a alias
$class = $builder->getDefinition($key)->class ? : $builder->getDefinition($key)->factory->entity;
if (!in_array('WpApplication\IWpSetUp', class_implements($class))) {
throw new InvalidStateException("Service '$class' must implement WpApplication\IWpSetUp.");
}
}
}
}
}
instanciu potrebujem aj preto lebo v dalsom procese predam sluzby dalsej sluzbe kde budem na nich spustat na sluzbe nejaku metodu:
$class = $this->container->getService($name);
$class->run();
Editoval duskohu (11. 1. 2014 21:28)
- David Matějka
- Moderator | 6445
a neni to cely overovani a pridavani do configu pod wpApplication zbytecny?
nebude stacit ve sluzbe, ktera vyzaduje WpApplication\IWpSetUp
si tuhle sluzbu vyzadat jako kazdou jinou zavislost? (tedy podle toho
interface)
- duskohu
- Člen | 778
@matej21 tych sluzieb bude viacej, kazda bude implementovat ten interface, cize takto to nepojde
- duskohu
- Člen | 778
Tag by sa musel definovat v neone, ked sa sluzba registruje, a to ju uz mozem rovno pomenovat, uvazujem ze budem prechadzat DIC a kazdu sluzbu ktora bude implementovat interface vytiahnem, ale potom sa straca postata ze pre extension tie sluzby postrcis v konfiguraci. Takze asi skoncim u toho ze nebudem moct pouzivat anonymne sluzby.
- jiri.pudil
- Nette Blogger | 1032
getByType() imo nevrací nic, protože Compiler nejdříve zpracovává extensions a potom až services. Takže v loadConfiguration() ještě ta služba v builderu není. Když to přesuneš do beforeCompile(), mělo by to fungovat.
- David Matějka
- Moderator | 6445
@jiri.pudil: nepude, musel bys zavolat
$this->getContainerBuilder()->prepareClassList();
, ale stejne
to moc nepomuze, jelikoz getByType umi vracet taky jen jednu definici dle
toho typu