Matt Agar
Technical Director at August
matt.agar@august.com.au
Symfony
Components
“...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
Events
The Dispatcher
Listeners
1. Events
Instances of
Symfony/Component/EventDispatcher/Event
Events have a
unique name
kernel.request
kernel.response
form.bind
form.post_set_data
console.command
console.exception
namespace AcmeStoreBundle;
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 for
Event objects
$dispatcher->dispatch('store.order');
namespace AcmeStoreBundleEvent;
use SymfonyComponentEventDispatcherEvent;
use AcmeStoreBundleOrder;
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
SymfonyComponentEventDispatcher
GenericEvent
use SymfonyComponentEventDispatcherGenericEvent;
$storeOrderEvent = new GenericEvent(
$order,
array('a' => 'b', 'c' => 0)
);
// Implements ArrayAccess and IteratorAggregate
echo $event['a'];
$order === $storeOrderEvent->getSubject();
2. The Dispatcher
use SymfonyComponentEventDispatcherEventDispatcher;
$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: AcmeHelloBundleEventGenerator
arguments: ["@event_dispatcher"]
namespace AcmeHelloBundle;
use SymfonyComponentEventDispatcherEventDispatcherInterface;
class EventGenerator
{
protected $dispatcher;
public function __construct(EventDispatcherInterface $dispatcher)
{
$this->dispatcher = $dispatcher;
}
}
Dispatching
events
// 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
SymfonyComponentEventDispatcher
ImmutableEventDispatcher
SymfonyComponentEventDispatcher
ContainerAwareEventDispatcher
SymfonyComponentEventDispatcher
DebugTraceableEventDispatcher
3. The Listeners
Basic Listeners
$dispatcher->addListener(
'event.name',
$listener, // PHP callable
$priority = 0
);
# app/config/config.yml
services:
event_listener:
class: AcmeHelloBundleEventListener
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: AcmeHelloBundleEventSubscriber
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?

Symfony2 Components - The Event Dispatcher