SlideShare ist ein Scribd-Unternehmen logo
1 von 50
Downloaden Sie, um offline zu lesen
Kdyby/Events
@ProchazkaFilip
Co si povíme?
● teorie kolem eventů
● jak to funguje v Nette
● 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);
}
}
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);
Přidáme posílání emailů...
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? - Jistě!
A co nějaké nevýhody?
● Nevíme vůbec co se zavolá
● IDE s tím neumí pracovat
PhpStorm
❤
Kdyby/Events
& @juznacz FTW!
Dejte @juznacz follow
je to borec
A co ty message queue?
Závěrem?
Eventy nejsou silver bullet,
užívejte s rozumem.
Dotazy?
Díky za pozornost!
filip-prochazka.com
Follow me maybe? @ProchazkaFilip

Weitere ähnliche Inhalte

Was ist angesagt?

Doctrine - Co dělat když entity nestačí [Filip Procházka] (7. sraz, Praha)
Doctrine - Co dělat když entity nestačí [Filip Procházka] (7. sraz, Praha)Doctrine - Co dělat když entity nestačí [Filip Procházka] (7. sraz, Praha)
Doctrine - Co dělat když entity nestačí [Filip Procházka] (7. sraz, Praha)Péhápkaři
 
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říž
 
ClojureScript
ClojureScriptClojureScript
ClojureScriptjakubkoci
 
Czechitas - školení PHP/Symfony MicroKernel
Czechitas - školení PHP/Symfony MicroKernelCzechitas - školení PHP/Symfony MicroKernel
Czechitas - školení PHP/Symfony MicroKernelDennis Fridrich
 
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
 
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
 

Was ist angesagt? (8)

Doctrine - Co dělat když entity nestačí [Filip Procházka] (7. sraz, Praha)
Doctrine - Co dělat když entity nestačí [Filip Procházka] (7. sraz, Praha)Doctrine - Co dělat když entity nestačí [Filip Procházka] (7. sraz, Praha)
Doctrine - Co dělat když entity nestačí [Filip Procházka] (7. sraz, Praha)
 
Drupal Front-end
Drupal Front-endDrupal Front-end
Drupal Front-end
 
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
 
Clean code
Clean codeClean code
Clean code
 
ClojureScript
ClojureScriptClojureScript
ClojureScript
 
Czechitas - školení PHP/Symfony MicroKernel
Czechitas - školení PHP/Symfony MicroKernelCzechitas - školení PHP/Symfony MicroKernel
Czechitas - školení PHP/Symfony MicroKernel
 
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
 
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
 

Andere mochten auch

Bezpečnost platformy Android
Bezpečnost platformy AndroidBezpečnost platformy Android
Bezpečnost platformy AndroidJana Moudrá
 
MS Fest 2013: Vývoj her v C# a MonoGame pro WP, iOS a Android
MS Fest 2013: Vývoj her v C# a MonoGame pro WP, iOS a AndroidMS Fest 2013: Vývoj her v C# a MonoGame pro WP, iOS a Android
MS Fest 2013: Vývoj her v C# a MonoGame pro WP, iOS a AndroidTomáš Slavíček
 
Tips for better CI on Android
Tips for better CI on AndroidTips for better CI on Android
Tips for better CI on AndroidTomoaki Imai
 
GitHub + Circle CI で幸せになろう
GitHub + Circle CI で幸せになろうGitHub + Circle CI で幸せになろう
GitHub + Circle CI で幸せになろうNobuhiro Ueda
 
はじめての CircleCI
はじめての CircleCIはじめての CircleCI
はじめての CircleCIYosuke Mizutani
 
Mobile-First SEO - The Marketers Edition #3XEDigital
Mobile-First SEO - The Marketers Edition #3XEDigitalMobile-First SEO - The Marketers Edition #3XEDigital
Mobile-First SEO - The Marketers Edition #3XEDigitalAleyda Solís
 

Andere mochten auch (6)

Bezpečnost platformy Android
Bezpečnost platformy AndroidBezpečnost platformy Android
Bezpečnost platformy Android
 
MS Fest 2013: Vývoj her v C# a MonoGame pro WP, iOS a Android
MS Fest 2013: Vývoj her v C# a MonoGame pro WP, iOS a AndroidMS Fest 2013: Vývoj her v C# a MonoGame pro WP, iOS a Android
MS Fest 2013: Vývoj her v C# a MonoGame pro WP, iOS a Android
 
Tips for better CI on Android
Tips for better CI on AndroidTips for better CI on Android
Tips for better CI on Android
 
GitHub + Circle CI で幸せになろう
GitHub + Circle CI で幸せになろうGitHub + Circle CI で幸せになろう
GitHub + Circle CI で幸せになろう
 
はじめての CircleCI
はじめての CircleCIはじめての CircleCI
はじめての CircleCI
 
Mobile-First SEO - The Marketers Edition #3XEDigital
Mobile-First SEO - The Marketers Edition #3XEDigitalMobile-First SEO - The Marketers Edition #3XEDigital
Mobile-First SEO - The Marketers Edition #3XEDigital
 

Ähnlich wie Kdyby/Events

Nette\Utils a příbuzní: skryté klenoty (Poslední sobota #68)
Nette\Utils a příbuzní: skryté klenoty (Poslední sobota #68)Nette\Utils a příbuzní: skryté klenoty (Poslední sobota #68)
Nette\Utils a příbuzní: skryté klenoty (Poslední sobota #68)Jan Smitka
 
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
 
Testování presenterů v Nette
Testování presenterů v NetteTestování presenterů v Nette
Testování presenterů v NetteTaste Medio
 
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
 
React premature performance optimization
React premature performance optimizationReact premature performance optimization
React premature performance optimizationMartinKritof1
 
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ě
 

Ähnlich wie Kdyby/Events (7)

Nette\Utils a příbuzní: skryté klenoty (Poslední sobota #68)
Nette\Utils a příbuzní: skryté klenoty (Poslední sobota #68)Nette\Utils a příbuzní: skryté klenoty (Poslední sobota #68)
Nette\Utils a příbuzní: skryté klenoty (Poslední sobota #68)
 
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?
 
Testování presenterů v Nette
Testování presenterů v NetteTestování presenterů v Nette
Testování presenterů v Nette
 
Django
DjangoDjango
Django
 
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)
 
React premature performance optimization
React premature performance optimizationReact premature performance optimization
React premature performance optimization
 
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
 

Mehr von Filip Procházka

Mehr von Filip Procházka (9)

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
 
CQRS v rohlik.cz
CQRS v rohlik.czCQRS v rohlik.cz
CQRS v rohlik.cz
 
Kdyby/Translation
Kdyby/TranslationKdyby/Translation
Kdyby/Translation
 
Kdyby/Redis
Kdyby/RedisKdyby/Redis
Kdyby/Redis
 
Nette Tester / Posobota
Nette Tester / PosobotaNette Tester / Posobota
Nette Tester / Posobota
 
Composer / Posobota
Composer / PosobotaComposer / Posobota
Composer / Posobota
 

Kdyby/Events