Ako ziskat instanciu anonymnej sluzby definovanej cez alias v neone

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

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)

duskohu
Člen | 778
+
0
-

@jiri.pudil getByType() nevracia nic. Samozrejme som to skusal.

David Matějka
Moderator | 6445
+
0
-

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
+
0
-

@matej21 tych sluzieb bude viacej, kazda bude implementovat ten interface, cize takto to nepojde

David Matějka
Moderator | 6445
+
0
-

aha. nebude lepsi pouzit tagy? viz kdyby/events

duskohu
Člen | 778
+
0
-

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
+
0
-

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
+
0
-

@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