symfony2 components - the event dispatcher

Post on 08-May-2015

686 Views

Category:

Internet

4 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Matt AgarTechnical Director at August

matt.agar@august.com.au

SymfonyComponents

“...the foundation of the Symfony full-stack framework, but they can also be used standalone even if you

don't use the framework...”

symfony.com/components

BrowserKit, ClassLoader, Config, Console, CssSelector, Debug, DependencyInjection,

DomCrawler, EventDispatcher, ExpressionLanguage, Filesystem, Finder, Form, HttpFoundation, HttpKernel, Locale, Intl, Icu, OptionsResolver, Process, PropertyAccess,

Routing, Security, Serializer, Stopwatch, Templating, Translation, Validator, Yaml

BrowserKit, ClassLoader, Config, Console, CssSelector, Debug, DependencyInjection,

DomCrawler, EventDispatcher, ExpressionLanguage, Filesystem, Finder, Form, HttpFoundation, HttpKernel, Locale, Intl, Icu, OptionsResolver, Process, PropertyAccess,

Routing, Security, Serializer, Stopwatch, Templating, Translation, Validator, Yaml

Powerful

Sculpin, Symfony Full Stack, phpBB, Drupal, Thelia, phpspec, Silex, Behat,

Guzzle, Laravel, phpDocumentor, Carew

Simple

Getting Started

// Clone directly from github.com/symfony/EventDispatcher

$ git clone https://github.com/symfony/EventDispatcher.git

// Install using Composer

$ curl -s http://getcomposer.org/installer | php

$ php composer.phar require symfony/event-dispatcher

EventsThe Dispatcher

Listeners

1. Events

Instances of

Symfony/Component/EventDispatcher/Event

Events have a unique name

kernel.requestkernel.response

form.bindform.post_set_dataconsole.command

console.exception

namespace Acme\StoreBundle;

final class StoreEvents

{

/**

* The store.order event is thrown each time an order is created

* in the system.

*/

const STORE_ORDER = 'store.order';

}

No need forEvent objects

$dispatcher->dispatch('store.order');

namespace Acme\StoreBundle\Event;

use Symfony\Component\EventDispatcher\Event;

use Acme\StoreBundle\Order;

class StoreOrderEvent extends Event {

protected $order;

public function __construct(Order $order) {

$this->order = $order;

}

public function getOrder() {

return $this->order;

}

}

$event->stopPropagation();

$event->isPropagationStopped();

Event Extras

Symfony\Component\EventDispatcher\

GenericEvent

use Symfony\Component\EventDispatcher\GenericEvent;

$storeOrderEvent = new GenericEvent(

$order,

array('a' => 'b', 'c' => 0)

);

// Implements \ArrayAccess and \IteratorAggregate

echo $event['a'];

$order === $storeOrderEvent->getSubject();

2. The Dispatcher

use Symfony\Component\EventDispatcher\EventDispatcher;

$dispatcher = new EventDispatcher();

Use the Single Instance

// access the dispatcher service in a controller

$dispatcher = $this->container->get('event_dispatcher');

# app/config/config.yml

services:

event_generator:

class: Acme\HelloBundle\EventGenerator

arguments: ["@event_dispatcher"]

namespace Acme\HelloBundle;

use Symfony\Component\EventDispatcher\EventDispatcherInterface;

class EventGenerator

{

protected $dispatcher;

public function __construct(EventDispatcherInterface $dispatcher)

{

$this->dispatcher = $dispatcher;

}

}

Dispatchingevents

// event name only

$dispatcher->dispatch('store.order');

// create the StoreOrderEvent and dispatch it

$event = new StoreOrderEvent($order);

$dispatcher->dispatch(StoreEvents::STORE_ORDER, $event);

$a = $dispatcher->dispatch('store.event', $b);

$a === $b; // true

// returns the dispatcher created event

$dispatcher->dispatch('foo.event')->isPropagationStopped()

Dispatcher Extras

Symfony\Component\EventDispatcher\

ImmutableEventDispatcher

Symfony\Component\EventDispatcher\

ContainerAwareEventDispatcher

Symfony\Component\EventDispatcher\

Debug\TraceableEventDispatcher

3. The Listeners

Basic Listeners

$dispatcher->addListener(

'event.name',

$listener, // PHP callable

$priority = 0

);

# app/config/config.yml

services:

event_listener:

class: Acme\HelloBundle\EventListener

tags:

- { name: kernel.event_listener,

event: kernel.exception,

method: onKernelException,

priority: 0 }

Subscribers

// Implements EventSubscriberInterface

$subscriber = new StoreSubscriber();

$dispatcher->addSubscriber($subscriber);

class StoreSubscriber implements EventSubscriberInterface {

public static function getSubscribedEvents() {

return array(

'kernel.request' => 'onKernelRequest',

'store.order' => array('onStoreOrder', 5),

'kernel.response' => array(

array('onKernelResponsePre', 10),

array('onKernelResponsePost', 0),

)

);

}

}

# app/config/config.yml

services:

event_listener:

class: Acme\HelloBundle\EventSubscriber

tags:

- { name: kernel.event_subscriber }

Listener Extras

// Event name and the dispatcher passed to listener

public function onStoreOrder(

Event $event,

$eventName,

EventDispatcherInterface $eventDispatcher

)

What next?

Thank You!Questions?

top related