contributte/event-dispatcher – zprovozněni

MikeLacroix
Člen | 60
+
0
-

Zdravím, rád bych ve své aplikace zprovoznil contributte/event-dispatcher, ale zatím neúspěšně. Kde zatím jsem?

V configu jsem to zaregistroval:

extensions:
	events: Contributte\EventDispatcher\DI\EventDispatcherExtension

Do svého presenteru jsem přidal implementaci interfacu, metodu getSubscribedEvents() a metodu zpracovavajici udalost:

class HomepagePresenter extends Nette\Application\UI\Presenter implements EventSubscriberInterface
{
	...

	public static function getSubscribedEvents(): array
	{
		barDump('registruji subscribera');

		return [ OrderSentEvent::class => 'orderSent' ];
	}

	public function orderSent(Event $event): void
	{
		barDump('yes!');
	}
}

Vytvořil jsem si třídu OrderSentEvent:

class OrderSentEvent {}

A v jedné z komponent na stránce mám:

...
public function handleOrder(): void
{
	$dispatcher = new EventDispatcher();
	$dispatcher->dispatch(new OrderSentEvent);
}

Co mám přidat dál, co dělám špatně? Děkuji :-)

Editoval MikeLacroix (19. 2. 2020 22:10)

Marek Bartoš
Nette Blogger | 1173
+
+2
-

Dokumentace je nejspíš trochu zavádějící, EventDispatcher je služba. Ten co sis vytvořil o nějakých subscriberech nic neví

Marek Bartoš
Nette Blogger | 1173
+
+1
-

Nekecej, fakt? @DavidMatějka mi včera odepsal, že „dokumentace nette je na velmi dobré úrovni.“ –

Tohle byla nejastnost v dokumentaci Contributte balíčku, kterou jsem rád přiznal, protože tam opravdu byla. Stěžuješ si na dokumentaci Nette pod absolutně nesouvisejícím příspěvkem a i kdyby šlo zrovna o Nette, tak si stěžuješ neoprávněně. Nejasné a outdated pasáže jsou v dokumentaci většiny OSS, to se prostě stává. Není nic jednodušího, než na chybu upozornit nebo ji rovnou opravit, autor nemůže nikdy dát dokumentaci která bude všem tak jasná, aby nebylo třeba nic měnit. Třeba dokumentaci Symfony píše někdo úplně jiný, než kdo Symfony programuje.

Mícháš dohromady zcela nesouvisející věci a přistupuješ k věci velice arogantně. Jestli s tím chceš pokračovat, tak prosím, ale můžeš si být jistý že s takovým přístupem tě pošlou doháje nejen tady, ale i v kterékoli jiné komunitě.

Pozn. moderátora: tento příspěvek je reakcí na útočný komentář od někoho jiného. Ten byl (stejně jako další off topic komentáře) smazán.

MikeLacroix
Člen | 60
+
0
-

Mno… dekuji Mabar za radu i za aktualizaci dokumentace.

Jeste bych se rad zeptal, kdyz mam subscribera implementovaneho jako třídu, ktera dedi od nette\application\ui\control a vytvářím ho pres interface:

<?php
interface IComponent
{
  public function create(): Component;
}

// config:
services:
  - App\Components\IComponent
?>

Jak to udelat tak, any se komponent zaregistroval do listeneru?

Marek Bartoš
Nette Blogger | 1173
+
+1
-

@MikeLacroix Subscriber musí být služba, ty máš jako službu factory která vrací třídu implementující subscriber a tu extension nenalezne.

Nevím jistě, zda by to vůbec momentálně šlo implementovat, takže spíš subscriber přesuň do modelu.

Pokud chceš mít komponentu opravdu jako subscribera, tak ji jako subscribera zaregistruj v jejím konstruktoru manuálně. Ale počítej s tím, že pokud komponenta v okamžiku spuštění eventu nebude existovat, tak event neodchytí

MikeLacroix
Člen | 60
+
0
-

Mabar napsal(a):

@MikeLacroix Subscriber musí být služba, ty máš jako službu factory která vrací třídu implementující subscriber a tu extension nenalezne.

Nevím jistě, zda by to vůbec momentálně šlo implementovat, takže spíš subscriber přesuň do modelu.

Pokud chceš mít komponentu opravdu jako subscribera, tak ji jako subscribera zaregistruj v jejím konstruktoru manuálně. Ale počítej s tím, že pokud komponenta v okamžiku spuštění eventu nebude existovat, tak event neodchytí

Chci to použít pro případ, kdy si uživatel něco nakliká v komponentě A a poté se (mimo jiné) překreslí snippet v paralelní komponentě B. Takže do modelu to přesouvat asi nebude můj případ. Zkusím to tedy ručně zaregistrovat. Díky ti!

David Matějka
Moderator | 6445
+
+1
-

Ahoj, a nehodily by se ti na to spíše nette události (fakticky je to implementace observer patternu)? viz https://doc.nette.org/…/smartobject#…

jinak by to IMHO mělo jít vyřešit tak, že se na tu factory přidá setup metoda, která tu zaregistrovanou instanci registruje do dispatcheru. s tím můžeš ale třeba narazit na problém, že ve chvíli, kdy je vyvolán event, tak ta komponenta, která na něj má reagovat, ještě vůbec není inicializovaná.

MikeLacroix
Člen | 60
+
0
-

David Matějka napsal(a):

Ahoj, a nehodily by se ti na to spíše nette události (fakticky je to implementace observer patternu)? viz https://doc.nette.org/…/smartobject#…

jinak by to IMHO mělo jít vyřešit tak, že se na tu factory přidá setup metoda, která tu zaregistrovanou instanci registruje do dispatcheru. s tím můžeš ale třeba narazit na problém, že ve chvíli, kdy je vyvolán event, tak ta komponenta, která na něj má reagovat, ještě vůbec není inicializovaná.

Jojo, to by určitě taky šlo. Ale nelíbí se mi, že už to musím někde šéfovat (při vytváření těch komponent asi) a ručně přidávat callbacky. Na contribute/event-dispatcher se mi líbilo, že bych si mohl kdykoliv kdekoliv reagovat na vyvolanou událost a ten, kdo událost vyvolává se nemusí vůbec starat o to, kdo a jak na ni reaguje. A taky, že bych nemusel hlídat, jestli jsem všude správně přidal ty callbacky… Jestli tedy správně rozumím principu :-)