Kdyby/Events
-
Upload
filip-prochazka -
Category
Technology
-
view
570 -
download
2
Transcript of Kdyby/Events
![Page 1: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/1.jpg)
Kdyby/Events@ProchazkaFilip
![Page 2: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/2.jpg)
![Page 3: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/3.jpg)
Co si povíme?● teorie kolem eventů● jak to funguje v Nette● Kdyby/Events prakticky● diskuze? připravte si otázky!
![Page 4: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/4.jpg)
Teorie kolem eventů
![Page 5: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/5.jpg)
Co jsou eventy/hooky?● modulárnost● rozšiřitelnost● znovupoužitelnost
![Page 6: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/6.jpg)
Eventy v Nette?class Circle extends Nette\Object{ public $onChange = []; public function setRadius($radius)
{ $this->radius = max(0, $radius);
$this->onChange($this, $this->radius); }
![Page 7: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/7.jpg)
Eventy v Nette?$circle = new Circle;
$circle->onChange[] =function($circle, $newValue) { echo 'there was a change!';};
$circle->setRadius(10);
![Page 8: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/8.jpg)
Nette magicclass Nette\Object{
public function __call($name, $args){
foreach ($this->{"on$name"} as $cb){
call_user_func_array($cb, $args);}
}
![Page 9: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/9.jpg)
Naco další event systém?● není to lazy● kompatibilita s otatními systémy
○ doctrine\orm○ symfony\event-dispatcher
![Page 10: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/10.jpg)
Lazy eventy?$circle->onChange[] =
function($arg) use ($foo) { $foo->hardWork($arg);};
$circle->onChange[] =function($arg) use ($bar) { $bar->hardWork($arg);};
![Page 11: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/11.jpg)
Doctrine ORM?class Listener implements EventSubscriber {
function getSubscribedEvents() {
return ['onFoo', 'onBar'];}
function onFoo($args) {// ...
}
![Page 12: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/12.jpg)
Doctrine ORM?
$evm = new EventManager();$evm->addEventSubscriber(new Listener()
);
![Page 13: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/13.jpg)
Doctrine ORM?
$evm->dispatch('onFoo',new Args($foo, $radius)
);
![Page 14: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/14.jpg)
Symfony?class Listener
implements EventSubscriberInterface{
function getSubscribedEvents() {return ['onFoo', 'onBar'];
}
function onFoo($args) {// ...
}
![Page 15: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/15.jpg)
Symfony?
$evd = new EventDispatcher();$evd->addSubscriber(new Listener()
);
![Page 16: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/16.jpg)
Symfony?
$evm->dispatch('onFoo',new Event($foo, $radius)
);
![Page 17: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/17.jpg)
Co takhle, Kdyby se všechny systémy daly používat dohromady?
![Page 18: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/18.jpg)
xkcd.com/927
![Page 19: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/19.jpg)
Kdyby/Events= Nette events (+ Doctrine EventManager)?(+ Symfony EventDispatcher)?
![Page 20: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/20.jpg)
Pojďme vyřešit problém z praxe
class OrderProcess{function openOrder();function addItem($item);function finish(Order $order);
![Page 21: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/21.jpg)
Přidáme posílání emailů...
public function __construct(EntityManager $em,Nette\Security\User $user,Nette\Http\Session $session
){
![Page 22: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/22.jpg)
Požadavek:“Po dokončení objednávky
se bude posílat email”
![Page 23: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/23.jpg)
Přidáme posílání emailů...
public function __construct(EntityManager $em,Nette\Security\User $user,Nette\Http\Session $session,Nette\Mail\IMailer $mailer
){
![Page 24: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/24.jpg)
Požadavek:“Přidej mi tam kredity za
objednávky”
![Page 25: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/25.jpg)
Přidáme kredity..public function __construct(EntityManager $em,Nette\Security\User $user,Nette\Http\Session $session,Nette\Mail\IMailer $mailer,My\CreditsRewarder $rewarder
){
![Page 26: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/26.jpg)
Požadavek:“Jeden partner chce
objednávky posílat do svého pokladního systému”
![Page 27: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/27.jpg)
Externí pokladní systém..public function __construct(
EntityManager $em,
Nette\Security\User $user,
Nette\Http\Session $session,
Nette\Mail\IMailer $mailer,
My\CreditsRewarder $rewarder,
Partner\CashRegisterClient $partner){
![Page 28: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/28.jpg)
Požadavek:“Budeme posílat smsky”
![Page 29: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/29.jpg)
Posílání smsek...public function __construct(
EntityManager $em,
Nette\Security\User $user,
Nette\Http\Session $session,
Nette\Mail\IMailer $mailer,
My\CreditsRewarder $rewarder,
Partner\CashRegisterClient $partner,
My\Sms\Sender $smsSender
){
![Page 30: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/30.jpg)
Požadavek:“V příštích 6 hodinách vracej
50% hodnoty objednávkyv kreditech, za všechny
objednané burgery”
![Page 31: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/31.jpg)
SRP(Single Responsibility Principle)
![Page 32: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/32.jpg)
Vraťme se na začátek...public function __construct(EntityManager $em,Nette\Security\User $user,Nette\Http\Session $session
){
![Page 33: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/33.jpg)
… a přidejme si jeden eventclass OrderProcesspublic $onFinish = [];function finish(Order $order) {// ...$this->onFinish($this, $order);
}
![Page 34: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/34.jpg)
… a napíšeme si listeneryclass OrderMailerListenerimplements Subscriber {function getSubscribedEvents() {return ['OrderProcess::onFinish'
];}
![Page 35: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/35.jpg)
… a napíšeme si listeneryclass OrderMailerListener
function __construct(IMailer $mailer);
function onFinish(Order $order) {// ..$this->mailer->send($message);
}
![Page 36: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/36.jpg)
… a napíšeme si listeneryclass CreditsRewardListener
function __construct(Rewarder $r, User $user);
function onFinish(Order $order) {$this->rewarder->reward(
$this->user->id,
$order->price * 0.05);
}
![Page 37: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/37.jpg)
… a napíšeme si listeneryclass SmsSenderListener
function __construct(Sms\Sender $sender);
function onFinish(Order $order) {// ..
$this->sender->send($message);
}
![Page 38: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/38.jpg)
Nezapomenout registrovatevents:subscribers:- OrderMailerListener- CreditsRewardListener- SmsSenderListener
![Page 39: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/39.jpg)
Profit!
![Page 40: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/40.jpg)
Poslední nejasnosti● Jak se $onFinish dostane k
listenerům?● Nemělo to být lazy? ● Můžu naslouchat na více událostí v
jednom listeneru? - Jistě!
![Page 41: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/41.jpg)
A co nějaké nevýhody?● Nevíme vůbec co se zavolá● IDE s tím neumí pracovat
![Page 42: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/42.jpg)
PhpStorm❤
Kdyby/Events
& @juznacz FTW!
![Page 43: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/43.jpg)
![Page 44: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/44.jpg)
![Page 45: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/45.jpg)
![Page 46: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/46.jpg)
Dejte @juznacz followje to borec
![Page 47: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/47.jpg)
A co ty message queue?
![Page 48: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/48.jpg)
Závěrem?Eventy nejsou silver bullet,
užívejte s rozumem.
![Page 49: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/49.jpg)
Dotazy?
![Page 50: Kdyby/Events](https://reader034.fdocuments.net/reader034/viewer/2022052623/559b65ef1a28ab2b3c8b46fb/html5/thumbnails/50.jpg)
Díky za pozornost!filip-prochazka.com
Follow me maybe? @ProchazkaFilip