Date post: | 08-May-2015 |
Category: |
Internet |
Upload: | sarah-el-atm |
View: | 675 times |
Download: | 4 times |
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?