Kdyby\Events – kdy použít a kdy ne?

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

Celkem jsem si oblíbil Kdyby\Events – zatím je používám pro posílání mailů, a zkrátka když spolupracují mezi sebou dva moduly, které by měli být i nezávislé na sobě.

Nicméně když jsem dnes přemýšlel, tak si říkám, že by šly používat skoro na všechno, ale to asi není úplně správné využití. Je nějaký pravidlo, kterým se řídit, kdy jej použít a kdy ne?

  1. Napadlo mě jej třeba použít mám fasádu, která přidává fotky, fasáda si zavolá třídu, která mi provede resize na požadované rozměry, vrátí pole s cestami k resiznutým fotkám a fasáde je uloží. To je takový standardní postup, ale šlo by samozřejmě mít i nějak onAddPhoto, na který bych navázal ten ořezávač.
  2. Teoreticky by to šlo použít i na validace v modelu. Sice zatím model nijak nevaliduje a předpokládám, že dostanu zvalidované věci. Ale prostě třeba před uložením si udělat nějaký event onValidate, na který bych si navázal kontrolu dat a pokud by něco nebylo v pořádku, tak by se stoplo ukládání, pokud by to bylo ok, pokračovalo se.

Prostě potřeboval bych chytit nějaký tip, kdy je dobré sáhnout po eventech, a kdy využít standardní postup, aby to nebyla event-driven appka

mkoubik
Člen | 728
+
0
-

Hodím sem pár věcí na které jsem v poslední době použil kdyby/events (nebo symfony/event-dispatcher).

  • Zmíněné validace: uživatel vyvolá nějakou akci a služba která ji vykonává vyhodí validační event a různé jiné služby to můžou stopnout (různé závislosti, oprávnění). Filip sem na fórum nedávno dával ukázku jak to implementovat. Asi by tím šlo implementovat kompletně ACL.
  • Úprava dat z formulářů: dělám teď jednu aplikaci kde nepoužívám žádné ORM a data z formulářů posílám do metod příslušných služeb. Ta vyhodí event obsahující balík dat a ostatní služby mohou ta data modifikovat.
    • Např. mám službu která se stará o hashování hesel a ta zahashuje heslo z registračního formuláře před uložením do db.
    • Při uploadu obrázku příslušná služba vezme Http\FileUpload, uloži si ho do svého úložiště a pak místo něj dá do dat nějaký unikátní klíč (např. id z databáze). Při updatu může řešit jestli se obrázek zachová, smaže, nahraje nový, atd.
  • Logování úplně čehokoliv kamkoliv, taky se nedávno řešilo na fóru.
Jan Suchánek
Člen | 404
+
0
-

@mkoubik: Zmíněné validace: v presenteru nebo komponentě odchytneš vyjímku z jakékoliv služby i třebas služby, která byla volána v události (eventu)?
Úprava dat z formulářů: předáváš jim nějaký objekt, který postupně upravuješ?

Editoval jenicek (25. 4. 2014 13:18)

mkoubik
Člen | 728
+
0
-
  • event obsahuje kolekci chyb, které mohou jednotlivé listenery přidávat, ty si pak vytáhnu (zjistím jestli tam je aspoň jedna).
  • stačí ArrayHash z $form->getValues().
Jiří Nápravník
Člen | 710
+
0
-

@mkoubik: díky za reakci, takže se nmusím bát používat Kdyby\Events často, protože se to tak v praxi i řeší v pohodě. Ty prevalidace, to zrovna radil Filip mě, řešil jsem mazání objektu a nějaký závislý to může stopnout…

Tohle je trochu offtopic, ale chtěl bych nahodit do Eventu i, pokud je uživatel přihlášen tak aby se aktualizovalo datum poslední aktivity. Na jaký event to navázat? Teď to mám v basepresenteru v beforerender (ten je na to dle mě nejlepší), existuje nějaký Nette event, který by byl na téhle „úrovni“? Nebo to jde navázat jen na nette\application? na co potom, ideálně? onPresenter?

Filip Procházka
Moderator | 4668
+
0
-

Mám například listener, který naslouchá na Application::onResponse a ukládá do databáze session_id ke konkrétnímu uživateli. Takže když chci, tak si potom vylistuju jednotlivé sessions uživatele a všechny je smažu z redisu a tím ho odhlásím.