40

I want to create custom events called user_logged so that i can attach my listeners to those events.

I want to execute few functions whenever user has logged in.

cn007b
  • 16,596
  • 7
  • 59
  • 74
Mirage
  • 30,868
  • 62
  • 166
  • 261

2 Answers2

78

Create a class which extends Symfony\Component\EventDispatcher\Event.

Then, use the event dispatcher service to dispatch the event:

$eventDispatcher = $container->get('event_dispatcher');
$eventDispatcher->dispatch('custom.event.identifier', $event);

You can register your event listener service like so:

tags:
    - { name: kernel.event_listener, event: custom.event.identifier, method: onCustomEvent }
Ryall
  • 12,010
  • 11
  • 53
  • 77
Lusitanian
  • 11,012
  • 1
  • 41
  • 38
  • 6
    Good answer. In addition, there are more details here: http://symfony.com/doc/current/components/event_dispatcher/introduction.html – gview Jul 26 '12 at 01:44
  • 2
    Indeed, but this is a simple enough way to get started. – Lusitanian Jul 26 '12 at 01:45
  • excellent answer!!, now the only question is where is the best place to dispatch a custom event?, maybe a service? – Nico Aug 07 '13 at 19:05
  • 1
    Events are usually dispatched in controllers, but can be also in dispatched in services if you need. – tomazahlin May 08 '14 at 00:07
  • Using the `event_dispatcher` service worked for me! I used `$dispatcher = new EventDispatcher;` but that did not fire my event for some reason. – Mirage Jun 25 '14 at 08:42
28

This answer is little bit extend answer.

services.yml

custom.event.home_page_event:
    class: AppBundle\EventSubscriber\HomePageEventSubscriber
    tags:
        - { name: kernel.event_listener, event: custom.event.home_page_event, method: onCustomEvent }

AppBundle/EventSubscriber/HomePageEventSubscriber.php

namespace AppBundle\EventSubscriber;
class HomePageEventSubscriber
{
    public function onCustomEvent($event)
    {
        var_dump($event->getCode());
    }
}

AppBundle/Event/HomePageEvent.php

namespace AppBundle\Event;
use Symfony\Component\EventDispatcher\Event;
class HomePageEvent extends Event
{
    private $code;

    public function setCode($code)
    {
        $this->code = $code;
    }

    public function getCode()
    {
        return $this->code;
    }
}

anywhere you wish, for example in home page controller

    use AppBundle\Event\HomePageEvent;
    // ...
    $eventDispatcher = $this->get('event_dispatcher');
    $event = new HomePageEvent();
    $event->setCode(200);
    $eventDispatcher->dispatch('custom.event.home_page_event', $event);
Community
  • 1
  • 1
cn007b
  • 16,596
  • 7
  • 59
  • 74