134 lines
3.5 KiB
ReStructuredText
134 lines
3.5 KiB
ReStructuredText
![]() |
Introduction
|
||
|
============
|
||
|
|
||
|
The Doctrine Event Manager is a simple event system used by the various Doctrine projects. It was originally built
|
||
|
for the DBAL and ORM but over time other projects adopted it and now it is available as a standalone library.
|
||
|
|
||
|
Installation
|
||
|
============
|
||
|
|
||
|
The library can easily be installed with composer.
|
||
|
|
||
|
.. code-block:: sh
|
||
|
|
||
|
$ composer require doctrine/event-manager
|
||
|
|
||
|
Setup
|
||
|
=====
|
||
|
|
||
|
The event system is controlled by the ``Doctrine\Common\EventManager`` class.
|
||
|
|
||
|
.. code-block:: php
|
||
|
|
||
|
use Doctrine\Common\EventManager;
|
||
|
|
||
|
$eventManager = new EventManager();
|
||
|
|
||
|
Listeners
|
||
|
=========
|
||
|
|
||
|
Now you are ready to listen for events. Here is an example of a custom event listener named ``TestEvent``.
|
||
|
|
||
|
.. code-block:: php
|
||
|
|
||
|
use Doctrine\Common\EventArgs;
|
||
|
use Doctrine\Common\EventManager;
|
||
|
|
||
|
final class TestEvent
|
||
|
{
|
||
|
public const preFoo = 'preFoo';
|
||
|
public const postFoo = 'postFoo';
|
||
|
|
||
|
/** @var EventManager */
|
||
|
private $eventManager;
|
||
|
|
||
|
/** @var bool */
|
||
|
public $preFooInvoked = false;
|
||
|
|
||
|
/** @var bool */
|
||
|
public $postFooInvoked = false;
|
||
|
|
||
|
public function __construct(EventManager $eventManager)
|
||
|
{
|
||
|
$eventManager->addEventListener([self::preFoo, self::postFoo], $this);
|
||
|
}
|
||
|
|
||
|
public function preFoo(EventArgs $eventArgs) : void
|
||
|
{
|
||
|
$this->preFooInvoked = true;
|
||
|
}
|
||
|
|
||
|
public function postFoo(EventArgs $eventArgs) : void
|
||
|
{
|
||
|
$this->postFooInvoked = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Create a new instance
|
||
|
$testEvent = new TestEvent($eventManager);
|
||
|
|
||
|
Dispatching Events
|
||
|
==================
|
||
|
|
||
|
Now you can dispatch events with the ``dispatchEvent()`` method.
|
||
|
|
||
|
.. code-block:: php
|
||
|
|
||
|
$eventManager->dispatchEvent(TestEvent::preFoo);
|
||
|
$eventManager->dispatchEvent(TestEvent::postFoo);
|
||
|
|
||
|
Removing Event Listeners
|
||
|
========================
|
||
|
|
||
|
You can easily remove a listener with the ``removeEventListener()`` method.
|
||
|
|
||
|
.. code-block:: php
|
||
|
|
||
|
$eventManager->removeEventListener([TestEvent::preFoo, TestEvent::postFoo], $testEvent);
|
||
|
|
||
|
Event Subscribers
|
||
|
=================
|
||
|
|
||
|
The Doctrine event system also has a simple concept of event subscribers. We can define a simple ``TestEventSubscriber`` class which implements the ``Doctrine\Common\EventSubscriber`` interface with a ``getSubscribedEvents()`` method which returns an array of events it should be subscribed to.
|
||
|
|
||
|
.. code-block:: php
|
||
|
|
||
|
use Doctrine\Common\EventSubscriber;
|
||
|
|
||
|
final class TestEventSubscriber implements EventSubscriber
|
||
|
{
|
||
|
/** @var bool */
|
||
|
public $preFooInvoked = false;
|
||
|
|
||
|
public function preFoo() : void
|
||
|
{
|
||
|
$this->preFooInvoked = true;
|
||
|
}
|
||
|
|
||
|
public function getSubscribedEvents() : array
|
||
|
{
|
||
|
return [TestEvent::preFoo];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$eventSubscriber = new TestEventSubscriber();
|
||
|
$eventManager->addEventSubscriber($eventSubscriber);
|
||
|
|
||
|
.. note::
|
||
|
|
||
|
The array returned by the ``getSubscribedEvents()`` method is a simple array with the values being the event names. The subscriber must have a method that is named exactly like the event.
|
||
|
|
||
|
Now when you dispatch an event, any event subscribers will be notified of that event.
|
||
|
|
||
|
.. code-block:: php
|
||
|
|
||
|
$eventManager->dispatchEvent(TestEvent::preFoo);
|
||
|
|
||
|
Now you can check the ``preFooInvoked`` property to see if the event subscriber was notified of the event:
|
||
|
|
||
|
.. code-block:: php
|
||
|
|
||
|
if ($eventSubscriber->preFooInvoked) {
|
||
|
// the preFoo method was invoked
|
||
|
}
|