+ All Categories
Home > Technology > Kdyby/Events

Kdyby/Events

Date post: 07-Jul-2015
Category:
Upload: filip-prochazka
View: 570 times
Download: 2 times
Share this document with a friend
50
Kdyby/Events @ProchazkaFilip
Transcript
Page 1: Kdyby/Events

Kdyby/Events@ProchazkaFilip

Page 2: Kdyby/Events
Page 3: Kdyby/Events

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

Teorie kolem eventů

Page 5: Kdyby/Events

Co jsou eventy/hooky?● modulárnost● rozšiřitelnost● znovupoužitelnost

Page 6: Kdyby/Events

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

Eventy v Nette?$circle = new Circle;

$circle->onChange[] =function($circle, $newValue) { echo 'there was a change!';};

$circle->setRadius(10);

Page 8: Kdyby/Events

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

Naco další event systém?● není to lazy● kompatibilita s otatními systémy

○ doctrine\orm○ symfony\event-dispatcher

Page 10: Kdyby/Events

Lazy eventy?$circle->onChange[] =

function($arg) use ($foo) { $foo->hardWork($arg);};

$circle->onChange[] =function($arg) use ($bar) { $bar->hardWork($arg);};

Page 11: Kdyby/Events

Doctrine ORM?class Listener implements EventSubscriber {

function getSubscribedEvents() {

return ['onFoo', 'onBar'];}

function onFoo($args) {// ...

}

Page 12: Kdyby/Events

Doctrine ORM?

$evm = new EventManager();$evm->addEventSubscriber(new Listener()

);

Page 13: Kdyby/Events

Doctrine ORM?

$evm->dispatch('onFoo',new Args($foo, $radius)

);

Page 14: Kdyby/Events

Symfony?class Listener

implements EventSubscriberInterface{

function getSubscribedEvents() {return ['onFoo', 'onBar'];

}

function onFoo($args) {// ...

}

Page 15: Kdyby/Events

Symfony?

$evd = new EventDispatcher();$evd->addSubscriber(new Listener()

);

Page 16: Kdyby/Events

Symfony?

$evm->dispatch('onFoo',new Event($foo, $radius)

);

Page 17: Kdyby/Events

Co takhle, Kdyby se všechny systémy daly používat dohromady?

Page 18: Kdyby/Events

xkcd.com/927

Page 19: Kdyby/Events

Kdyby/Events= Nette events (+ Doctrine EventManager)?(+ Symfony EventDispatcher)?

Page 20: Kdyby/Events

Pojďme vyřešit problém z praxe

class OrderProcess{function openOrder();function addItem($item);function finish(Order $order);

Page 21: Kdyby/Events

Přidáme posílání emailů...

public function __construct(EntityManager $em,Nette\Security\User $user,Nette\Http\Session $session

){

Page 22: Kdyby/Events

Požadavek:“Po dokončení objednávky

se bude posílat email”

Page 23: Kdyby/Events

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

Požadavek:“Přidej mi tam kredity za

objednávky”

Page 25: Kdyby/Events

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

Požadavek:“Jeden partner chce

objednávky posílat do svého pokladního systému”

Page 27: Kdyby/Events

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

Požadavek:“Budeme posílat smsky”

Page 29: Kdyby/Events

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

Požadavek:“V příštích 6 hodinách vracej

50% hodnoty objednávkyv kreditech, za všechny

objednané burgery”

Page 31: Kdyby/Events

SRP(Single Responsibility Principle)

Page 32: Kdyby/Events

Vraťme se na začátek...public function __construct(EntityManager $em,Nette\Security\User $user,Nette\Http\Session $session

){

Page 33: Kdyby/Events

… a přidejme si jeden eventclass OrderProcesspublic $onFinish = [];function finish(Order $order) {// ...$this->onFinish($this, $order);

}

Page 34: Kdyby/Events

… a napíšeme si listeneryclass OrderMailerListenerimplements Subscriber {function getSubscribedEvents() {return ['OrderProcess::onFinish'

];}

Page 35: Kdyby/Events

… a napíšeme si listeneryclass OrderMailerListener

function __construct(IMailer $mailer);

function onFinish(Order $order) {// ..$this->mailer->send($message);

}

Page 36: Kdyby/Events

… 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

… a napíšeme si listeneryclass SmsSenderListener

function __construct(Sms\Sender $sender);

function onFinish(Order $order) {// ..

$this->sender->send($message);

}

Page 38: Kdyby/Events

Nezapomenout registrovatevents:subscribers:- OrderMailerListener- CreditsRewardListener- SmsSenderListener

Page 39: Kdyby/Events

Profit!

Page 40: Kdyby/Events

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

A co nějaké nevýhody?● Nevíme vůbec co se zavolá● IDE s tím neumí pracovat

Page 42: Kdyby/Events

PhpStorm❤

Kdyby/Events

& @juznacz FTW!

Page 43: Kdyby/Events
Page 44: Kdyby/Events
Page 45: Kdyby/Events
Page 46: Kdyby/Events

Dejte @juznacz followje to borec

Page 47: Kdyby/Events

A co ty message queue?

Page 48: Kdyby/Events

Závěrem?Eventy nejsou silver bullet,

užívejte s rozumem.

Page 49: Kdyby/Events

Dotazy?

Page 50: Kdyby/Events

Díky za pozornost!filip-prochazka.com

Follow me maybe? @ProchazkaFilip


Recommended