Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kdyby/Events #posobota

Kdyby/Events #posobota

The Kdyby/Events extension provides a robust events system for the Nette Framework.

Avatar for Filip Procházka

Filip Procházka

September 30, 2014
Tweet

More Decks by Filip Procházka

Other Decks in Technology

Transcript

  1. 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!
  2. Eventy v Nette? class Circle extends Nette\Object { public $onChange

    = []; public function setRadius($radius) { $this->radius = max(0, $radius); $this->onChange($this, $this->radius); }
  3. Eventy v Nette? $circle = new Circle; $circle->onChange[] = function($circle,

    $newValue) { echo 'there was a change!'; }; $circle->setRadius(10);
  4. Nette magic class Nette\Object { public function __call($name, $args) {

    foreach ($this->{"on$name"} as $cb) { call_user_func_array($cb, $args); } }
  5. Co je problém? class MyControl extends UI\Control { public function

    handleFoo() { // logic $this->presenter->flashMessage('Yatta!'); $this->redirect('Foo:'); } }
  6. Řešení? class MyControl extends UI\Control { public $onSuccess = [];

    public function handleFoo() { // logic $this->onSuccess($this, $arg); } }
  7. Naco další event systém? • není to lazy • kompatibilita

    s otatními systémy ◦ doctrine\orm ◦ symfony\event-dispatcher
  8. Lazy eventy? $circle->onChange[] = function($arg) use ($foo) { $foo->hardWork($arg); };

    $circle->onChange[] = function($arg) use ($bar) { $bar->hardWork($arg); };
  9. Doctrine ORM? class Listener implements EventSubscriber { function getSubscribedEvents() {

    return ['onFoo', 'onBar']; } function onFoo($args) { // ... }
  10. Pojďme vyřešit problém z praxe class OrderProcess { function openOrder();

    function addItem($item); function finish(Order $order);
  11. 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 ){
  12. 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 ){
  13. … a přidejme si jeden event class OrderProcess public $onFinish

    = []; function finish(Order $order) { // ... $this->onFinish($this, $order); }
  14. … a napíšeme si listenery class OrderMailerListener implements Subscriber {

    function getSubscribedEvents() { return [ 'OrderProcess::onFinish' ]; }
  15. … a napíšeme si listenery class OrderMailerListener function __construct(IMailer $mailer);

    function onFinish(Order $order) { // .. $this->mailer->send($message); }
  16. … 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); }
  17. … a napíšeme si listenery class SmsSenderListener function __construct(Sms\Sender $sender);

    function onFinish(Order $order) { // .. $this->sender->send($message); }
  18. 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?