Kdyby\Events – kdy použít a kdy ne?
- Jiří Nápravník
- Člen | 710
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?
- 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č.
- 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
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
@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)
- Jiří Nápravník
- Člen | 710
@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
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.