Kdyby\Events ako naviazat event na factory?

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

Caute, riesim jeden problem. Povedzme ze mam comtrol:

FooControl extends Control{

	/** @var array */
	public $onCreate = array();

	public function __construct(...){
		...
	}

	public function process(){
		$this->onCreate($this, ...);
	}

}

/**
 * IFooControlFactory
 */
interface IFooControlFactory
{

	/**
	 * @return FooControl
	 */
	function create();
}

zaregistrujem

factories:
	FooControlFactory:
		create: FooControl
		implement: IFooControlFactory

a Listener:

public function getSubscribedEvents()
{
	return array('FooControl::onCreate');
}

ako mam riesit situaciu ked by som chcel moju komponentu zaregistrovat takto:

factories:
	- IFooControlFactory

toto nepojde:

public function getSubscribedEvents()
{
	return array('IFooControlFactory::onCreate');
}
Filip Procházka
Moderator | 4668
+
+1
-

No jistěže ne, protože event je registrovaný na FooControl. Na tom interface žádný event registrovaný nemáš.

Můžeš ale udělat tohle

factories:
    -
	implement: IFooControlFactory
	setup:
		- "?->createEvent(?)->dispatch($service);"(
			@Kdyby\Events\EventManager,
			'IFooControlFactory::onCreate'
		)
duskohu
Člen | 778
+
0
-

@Filip Procházka dik, teraz sa uz len rozhodnut aky zapis sa mi paci, v tomto pripade asi skor ten 1. :-)

Tomáš Votruba
Moderator | 1114
+
0
-

Generické řešení pro všechny komponenty pomocí extension:

Extension

class EventOnControlCreateCreateExtension extends CompilerExtension
{

	public function beforeCompile()
	{
		if ($definition->implement && method_exists($definition->implement, 'create')) {
			$definition->addSetup('?->createEvent(?)->dispatch($service)', [
				'@Kdyby\Events\EventManager',
				'Nette\Application\UI\Control::onCreate'
			]);
		}
	}

}

Subscriber

class OnCreateControl implements Subscriber
{

	/**
	 * @return string[]
	 */
	public function getSubscribedEvents()
	{
		return ['Nette\Application\UI\Control::onCreate'];
	}


	public function onCreate($control)
	{
		// modify what you want
	}

}

Editoval Tomáš Votruba (26. 3. 2014 7:13)

mishak
Člen | 94
+
0
-

Šlo by líně poslouchat onCreate jen určité komponenty? Tohle se mi moc nelíbí (kanón na vrabce).

Tomáš Votruba
Moderator | 1114
+
0
-

@mishak: Pokud potřebuješ jen to, stačí kouknout výše

Editoval Tomáš Votruba (26. 3. 2014 11:09)

mishak
Člen | 94
+
0
-

Sem se zeptal asi blbě. Můžu nějak poslouchat jen události vytvoření určité komponenty podle její třídy/interface bez toho aniž bych poslouchal továrnu (kdo ji vytváří je mi jedno a nechci vědět)?

Tomáš Votruba
Moderator | 1114
+
0
-

Vytvoření komponenty se děje pomocí továrny. Každá komponenta implementuje vlastní interface, tzn. posloucháš jen jednu komponentu (resp. továrnu). Interface je v tomto případě továrna.

Případně napiš, jak to máš a co konkrétně potřebuješ řešit. Na tom to půjde možná vysvětlit lépe.

Editoval Tomáš Votruba (26. 3. 2014 11:21)