Kdyby\Events ako naviazat event na factory?
- duskohu
- Člen | 778
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
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'
)
- Tomáš Votruba
- Moderator | 1114
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)
- Tomáš Votruba
- Moderator | 1114
@mishak: Pokud potřebuješ jen to, stačí kouknout výše
Editoval Tomáš Votruba (26. 3. 2014 11:09)
- Tomáš Votruba
- Moderator | 1114
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)