SlideShare uma empresa Scribd logo
1 de 54
Baixar para ler offline
Kdyby/Events 
@ProchazkaFilip
Co si povíme? 
● teorie kolem eventů 
● jak to funguje v Nette 
● eventy v komponentách 
● Kdyby/Events prakticky 
● diskuze? připravte si otázky!
Teorie kolem eventů
Co jsou eventy/hooky? 
● modulárnost 
● rozšiřitelnost 
● znovupoužitelnost
Eventy v Nette? 
class Circle extends NetteObject 
{ 
public $onChange = []; 
public function setRadius($radius) 
{ 
$this->radius = max(0, $radius); 
$this->onChange($this, $this->radius); 
}
Eventy v Nette? 
$circle = new Circle; 
$circle->onChange[] = 
function($circle, $newValue) { 
echo 'there was a change!'; 
}; 
$circle->setRadius(10);
Nette magic 
class NetteObject 
{ 
public function __call($name, $args) 
{ 
foreach ($this->{"on$name"} as $cb) 
{ 
call_user_func_array($cb, $args); 
} 
}
Eventy 
v komponentách
Co je problém? 
class MyControl extends UIControl { 
public function handleFoo() { 
// logic 
$this->presenter->flashMessage('Yatta!'); 
$this->redirect('Foo:'); 
} 
}
Řešení? 
class MyControl extends UIControl { 
public $onSuccess = []; 
public function handleFoo() { 
// logic 
$this->onSuccess($this, $arg); 
} 
}
Řešení? 
$control->onSuccess[] = function () { 
$this->presenter->flashMessage('Yatta!'); 
$this->redirect('Foo:'); 
};
Kdyby/Events
Naco další event systém? 
● není to lazy 
● kompatibilita s otatními systémy 
○ doctrineorm 
○ symfonyevent-dispatcher
Lazy eventy? 
$circle->onChange[] = 
function($arg) use ($foo) { 
$foo->hardWork($arg); 
}; 
$circle->onChange[] = 
function($arg) use ($bar) { 
$bar->hardWork($arg); 
};
Doctrine ORM? 
class Listener implements EventSubscriber { 
function getSubscribedEvents() { 
return ['onFoo', 'onBar']; 
} 
function onFoo($args) { 
// ... 
}
Doctrine ORM? 
$evm = new EventManager(); 
$evm->addEventSubscriber( 
new Listener() 
);
Doctrine ORM? 
$evm->dispatch( 
'onFoo', 
new Args($foo, $radius) 
);
Symfony? 
class Listener 
implements EventSubscriberInterface 
{ 
function getSubscribedEvents() { 
return ['onFoo', 'onBar']; 
} 
function onFoo($args) { 
// ... 
}
Symfony? 
$evd = new EventDispatcher(); 
$evd->addSubscriber( 
new Listener() 
);
Symfony? 
$evm->dispatch( 
'onFoo', 
new Event($foo, $radius) 
);
Co takhle, Kdyby se 
všechny systémy daly 
používat dohromady?
xkcd.com/927
Kdyby/Events 
= Nette events 
(+ Doctrine EventManager)? 
(+ Symfony EventDispatcher)?
Pojďme vyřešit problém z praxe 
class OrderProcess 
{ 
function openOrder(); 
function addItem($item); 
function finish(Order $order);
Nějaké ty basic závislosti 
public function __construct( 
EntityManager $em, 
NetteSecurityUser $user, 
NetteHttpSession $session 
){
Požadavek: 
“Po dokončení objednávky 
se bude posílat email”
Přidáme posílání emailů... 
public function __construct( 
EntityManager $em, 
NetteSecurityUser $user, 
NetteHttpSession $session, 
NetteMailIMailer $mailer 
){
Požadavek: 
“Přidej mi tam kredity za 
objednávky”
Přidáme kredity.. 
public function __construct( 
EntityManager $em, 
NetteSecurityUser $user, 
NetteHttpSession $session, 
NetteMailIMailer $mailer, 
MyCreditsRewarder $rewarder 
){
Požadavek: 
“Jeden partner chce 
objednávky posílat do 
svého pokladního systému”
Externí pokladní systém.. 
public function __construct( 
EntityManager $em, 
NetteSecurityUser $user, 
NetteHttpSession $session, 
NetteMailIMailer $mailer, 
MyCreditsRewarder $rewarder, 
PartnerCashRegisterClient $partner 
){
Požadavek: 
“Budeme posílat smsky”
Posílání smsek... 
public function __construct( 
EntityManager $em, 
NetteSecurityUser $user, 
NetteHttpSession $session, 
NetteMailIMailer $mailer, 
MyCreditsRewarder $rewarder, 
PartnerCashRegisterClient $partner, 
MySmsSender $smsSender 
){
Požadavek: 
“V příštích 6 hodinách vracej 
50% hodnoty objednávky 
v kreditech, za všechny 
objednané burgery”
SRP (Single Responsibility Principle)
Vraťme se na začátek... 
public function __construct( 
EntityManager $em, 
NetteSecurityUser $user, 
NetteHttpSession $session 
){
… a přidejme si jeden event 
class OrderProcess 
public $onFinish = []; 
function finish(Order $order) { 
// ... 
$this->onFinish($this, $order); 
}
… a napíšeme si listenery 
class OrderMailerListener 
implements Subscriber { 
function getSubscribedEvents() { 
return [ 
'OrderProcess::onFinish' 
]; 
}
… a napíšeme si listenery 
class OrderMailerListener 
function __construct(IMailer $mailer); 
function onFinish(Order $order) { 
// .. 
$this->mailer->send($message); 
}
… a napíšeme si listenery 
class CreditsRewardListener 
function __construct( 
Rewarder $r, User $user); 
function onFinish(Order $order) { 
$this->rewarder->reward( 
$this->user->id, 
$order->price * 0.05); 
}
… a napíšeme si listenery 
class SmsSenderListener 
function __construct(SmsSender $sender); 
function onFinish(Order $order) { 
// .. 
$this->sender->send($message); 
}
Nezapomenout registrovat 
events: 
subscribers: 
- OrderMailerListener 
- CreditsRewardListener 
- SmsSenderListener
Profit!
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?
A co nějaké nevýhody? 
● Nevíme vůbec co se zavolá 
● IDE s tím neumí pracovat
PhpStorm 
❤ 
Kdyby/Events
Go follow 
@juznacz 
& @matej_21
A co ty message queue? 
Dáme demo?
Závěrem? 
Eventy nejsou silver bullet, 
užívejte s rozumem.
Dotazy?
Díky za pozornost! 
filip-prochazka.com 
Follow me maybe? @ProchazkaFilip

Mais conteúdo relacionado

Mais procurados

MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)Martin Zeman
 
Jak přemigrovat Slevomat na Doctrine za jedno dopoledne
Jak přemigrovat Slevomat na Doctrine za jedno dopoledneJak přemigrovat Slevomat na Doctrine za jedno dopoledne
Jak přemigrovat Slevomat na Doctrine za jedno dopoledneJosef Kříž
 
WebSockets - how to do real-time applications in PHP
WebSockets - how to do real-time applications in PHPWebSockets - how to do real-time applications in PHP
WebSockets - how to do real-time applications in PHPBrnoPHP
 
ClojureScript
ClojureScriptClojureScript
ClojureScriptjakubkoci
 
Jakub Vrána: Zkušenosti z vývoje ve Facebooku
Jakub Vrána: Zkušenosti z vývoje ve FacebookuJakub Vrána: Zkušenosti z vývoje ve Facebooku
Jakub Vrána: Zkušenosti z vývoje ve FacebookuDevelcz
 
Testování presenterů v Nette
Testování presenterů v NetteTestování presenterů v Nette
Testování presenterů v NetteTaste Medio
 
Czechitas - školení PHP/Symfony MicroKernel
Czechitas - školení PHP/Symfony MicroKernelCzechitas - školení PHP/Symfony MicroKernel
Czechitas - školení PHP/Symfony MicroKernelDennis Fridrich
 
Na co si dát v Javascriptu pozor? - Barcamp Hradec Králové 2015
Na co si dát v Javascriptu pozor? - Barcamp Hradec Králové 2015Na co si dát v Javascriptu pozor? - Barcamp Hradec Králové 2015
Na co si dát v Javascriptu pozor? - Barcamp Hradec Králové 2015angular-cz
 

Mais procurados (15)

MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
 
Drupal Front-end
Drupal Front-endDrupal Front-end
Drupal Front-end
 
Clean code
Clean codeClean code
Clean code
 
Jak přemigrovat Slevomat na Doctrine za jedno dopoledne
Jak přemigrovat Slevomat na Doctrine za jedno dopoledneJak přemigrovat Slevomat na Doctrine za jedno dopoledne
Jak přemigrovat Slevomat na Doctrine za jedno dopoledne
 
WebSockets - how to do real-time applications in PHP
WebSockets - how to do real-time applications in PHPWebSockets - how to do real-time applications in PHP
WebSockets - how to do real-time applications in PHP
 
Nette Tester / Posobota
Nette Tester / PosobotaNette Tester / Posobota
Nette Tester / Posobota
 
Kdyby/Redis
Kdyby/RedisKdyby/Redis
Kdyby/Redis
 
CQRS v rohlik.cz
CQRS v rohlik.czCQRS v rohlik.cz
CQRS v rohlik.cz
 
ClojureScript
ClojureScriptClojureScript
ClojureScript
 
201502.ReinIT.Dev
201502.ReinIT.Dev201502.ReinIT.Dev
201502.ReinIT.Dev
 
Jakub Vrána: Zkušenosti z vývoje ve Facebooku
Jakub Vrána: Zkušenosti z vývoje ve FacebookuJakub Vrána: Zkušenosti z vývoje ve Facebooku
Jakub Vrána: Zkušenosti z vývoje ve Facebooku
 
Django
DjangoDjango
Django
 
Testování presenterů v Nette
Testování presenterů v NetteTestování presenterů v Nette
Testování presenterů v Nette
 
Czechitas - školení PHP/Symfony MicroKernel
Czechitas - školení PHP/Symfony MicroKernelCzechitas - školení PHP/Symfony MicroKernel
Czechitas - školení PHP/Symfony MicroKernel
 
Na co si dát v Javascriptu pozor? - Barcamp Hradec Králové 2015
Na co si dát v Javascriptu pozor? - Barcamp Hradec Králové 2015Na co si dát v Javascriptu pozor? - Barcamp Hradec Králové 2015
Na co si dát v Javascriptu pozor? - Barcamp Hradec Králové 2015
 

Semelhante a Kdyby/Events #posobota

Péhápkaři - Píšeme čitelný kód #3 by Driveto
Péhápkaři - Píšeme čitelný kód #3 by DrivetoPéhápkaři - Píšeme čitelný kód #3 by Driveto
Péhápkaři - Píšeme čitelný kód #3 by DrivetoPetr Bechyně
 
Silex
SilexSilex
SilexKeyup
 
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)Péhápkaři
 
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?Develcz
 
Petr Heinz - Čisté testy, dobré testy
Petr Heinz - Čisté testy, dobré testyPetr Heinz - Čisté testy, dobré testy
Petr Heinz - Čisté testy, dobré testyAnna Kovárová
 
Technologie užívané při vývoji velkých e-shopů
Technologie užívané při vývoji velkých e-shopůTechnologie užívané při vývoji velkých e-shopů
Technologie užívané při vývoji velkých e-shopůPeckaDesign.cz
 

Semelhante a Kdyby/Events #posobota (6)

Péhápkaři - Píšeme čitelný kód #3 by Driveto
Péhápkaři - Píšeme čitelný kód #3 by DrivetoPéhápkaři - Píšeme čitelný kód #3 by Driveto
Péhápkaři - Píšeme čitelný kód #3 by Driveto
 
Silex
SilexSilex
Silex
 
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
 
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?
 
Petr Heinz - Čisté testy, dobré testy
Petr Heinz - Čisté testy, dobré testyPetr Heinz - Čisté testy, dobré testy
Petr Heinz - Čisté testy, dobré testy
 
Technologie užívané při vývoji velkých e-shopů
Technologie užívané při vývoji velkých e-shopůTechnologie užívané při vývoji velkých e-shopů
Technologie užívané při vývoji velkých e-shopů
 

Mais de Filip Procházka

Mais de Filip Procházka (6)

4 roky remote
4 roky remote4 roky remote
4 roky remote
 
Před čím vás Nette ani Symfony neochrání
Před čím vás Nette ani Symfony neochráníPřed čím vás Nette ani Symfony neochrání
Před čím vás Nette ani Symfony neochrání
 
Nejlepší cache je žádná cache
Nejlepší cache je žádná cacheNejlepší cache je žádná cache
Nejlepší cache je žádná cache
 
Testování prakticky
Testování praktickyTestování prakticky
Testování prakticky
 
Kdyby/Translation
Kdyby/TranslationKdyby/Translation
Kdyby/Translation
 
Composer / Posobota
Composer / PosobotaComposer / Posobota
Composer / Posobota
 

Kdyby/Events #posobota