Skip to main content

Symfony Tutorials: Event Dispatcher

Symfony Tutorials: Event Dispatcher

Symfony EventDispatcher is object which interacts with different set of objects when certain event happens.

To illustrate Event Dispatcher definition let’s consider the online shopping website example.

suppose you want to purchase a mobile from online shopping website , but unfortunately that mobile is out of stock.

Then you subscribe into online shopping website for this mobile availability.

When mobile comes in stock, online shopping website notifies you about mobile phone’s availability via email.

In above scenario


  • you are the Event Listener / Event Subscriber
  • mobile availability is Event
  • online shopping website is Event Dispatcher.



Symfony EventDispatcher works in same manner.for example, whenever there is HTTP request, Kernel creates a request object and it dispatches an event kernel.request.

Whoever subscribes to kernel.request event gets notified.

So here you might be having few questions in my mind.

What is Event?

Event object describe what event is and add some additional information so that its listener or subscriber can get enough information about event.

What is EventDispatcher?

EventDispatcher is central object which dispatches the event to all its listener or subscriber.
EventDispatcher maintains the list of all listeners of a particular Event.

use Symfony\Component\EventDispatcher\EventDispatcher;

$dispatcher =new EventDispatcher();

What is Event Listener?

Listener is a object which performs a task whenever a associated event happens. 
But first we need to attach listener to Event Dispatcher for a particular event.

$listener=new MobileAvailabilityListener();
$dispatcher->addListener('store.mobile.available',array($listener,'sendEmailToUsers'));

Considering Online Shopping Store example let’s create a custom event and dispatch this event.

Here we want to create mobile availability event which get dispatched whenever mobile is available.

First we create static event class which holds event name and its instance information

Static Event Class


final class MobileEvents
{
/**
     * The store.mobile.available event is thrown each time when mobile 
  * is available in store
     *
     * The event listener receives an
     * Acme\StoreBundle\Event\MobileAvailableEvent instance.
     *
     * @var string
     */
const MOBILE_AVAILABLE='store.mobile.available';
}

Later, create actual event object.

Symfony uses Symfony\Component\EventDispatcher\Event class.

This class wont give us enough information about mobile availability therefor we need to subclass it and add additional information.

namespace Acme\StoreBundle\Event;

use Symfony\Component\EventDispatcher\Event;
use Acme\StoreBundle\Mobile;

class MobileAvailableEvent
{
  protected $mobile;

  public function__construct(Mobile $mobile)
  {
    $this->mobile=$mobile;
  }

  public function getMobile()
  {
    return $this->mobile;
  }
}


Later, create event listener, which sends emails to user regarding availability of the mobile phone.

use Acme\StoreBundle\Event\MobileAvailableEvent;

class MobileAvailabilityListener
{
  // ...

  public function sendEmailToUsers(MobileAvailableEvent $event)
  {
     // ... send email to users
  }
}



Now all is set, let’s attach this listener to the dispatcher. And dispatch the event.
use Symfony\Component\EventDispatcher\EventDispatcher;
use Acme\StoreBundle\Event\MobileAvailableEvent;
use Acme\StoreBundle\Event\MobileAvailabilityListener;
use Acme\StoreBundle\Entity\Mobile;
$dispatcher = new EventDispatcher(); // attach listener $listener = new MobileAvailabilityListener(); $dispatcher->addListener(MobileEvents::MOBILE_AVAILABLE, array($listener, 'sendEmailToUsers')); //if mobile is available then dispatch the event
$mobile = new Mobile();
$event = new MobileAvailableEvent($mobile);
$dispatcher->dispatch(MobileEvents::MOBILE_AVAILABLE, $event);


This is a every basic example, you can create event for user registration process and can send confirmation email via event listener or can do  many things using Symfony Event Dispatcher.

Comments

Popular posts from this blog

AngularJs Tutorial: Getting Started

This tutorial will help you to create a dynamic web application using power of AngularJs. ·   What is AngularJs AngularJs is javascript MVC framework (maintained by Google) which molds static HTML application to dynamic web application. That was a brief introduction, you can find more information on Wiki and AngularJS Site . AngularJs follows MVC pattern to separate out model from view and manage it by controller. See this image Goal of using AngularJs is to convert static HTML template to dynamic (Angular) template.   ·   How to convert static template to dynamic (Angular) Template Now consider the following static HTML template which contain list of movies title. <html> <head></head> <body>   <h1>Upcoming Movies</h1> <ul>     <li>       <span>Godzilla</span>     </li> <li>       <span>Batman vs Superman</span>     </li> <li>       <span>Sta

AngularJs Tutorials : Bootstrap

Every application starts with bootstrap process which initialize application and wire it other with dependencies and configurations. AngularJs is not different from other application. It also starts application with bootstrap process. Following operation happens inside AngularJs bootstrap process. Load application module. Create dependency injector and load dependencies. Compile HTML and create scope for application. All these steps happens inside angular.js scripting file. therefore we need to include it first. we can include it inside HEAD tag or at end of BODY tag. Note: Adding angular.js file at end of body tag will allow browser to load of HTML elements without any delay and afterwards load angular.js and begin bootstrapping process. You can get angular.js source file from https://code.angularjs.org/ <script src= ”https://code.angularjs.org/1.3.0/angular.js” type= ”text/javascript” > AngularJs bootstrap process happens on docum

How to create SSH Key for GitHub and Bitbucket

This  post  demonstrate how to  generate  SSH private and  public   key  with fundamental steps and  assist   you  to  add   public   key  inside your  GitHub  and Bitbucket account. But first why we  need  this SSH  public   key ? Whether you are working in the team or an individual and you want make any operations on secure GIT repository like clone or push your latest changes then you require to provide your credentials to help GIT to authenticate you and approve those operations. But when  you  do so,  you  are  asked  to  provide  your username &  password ,  each   time  on  each   operation . It looks  simple  earlier, but later  becomes  a  headache . SSH  connection   helps   us  to  authenticate  using public and private keys, that  we  generate only once, later  we  don’t need to  authenticate ,  SSH  will  do  this behalf of  us . But how does it  work ? SSH   authenticate  you  using  an  identity , your  identity  and this  identity   comprise   combination  of p