Skip to content

Commit

Permalink
Add an interface for EventDispatcher.
Browse files Browse the repository at this point in the history
Having an interface will let us not duck type on the method and instead
use `instanceof`. It also lets us make typehints elsewhere in CakePHP if
we need to.

Refs #6689
  • Loading branch information
markstory committed May 30, 2015
1 parent 62e6b57 commit 60f955a
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 5 deletions.
3 changes: 2 additions & 1 deletion src/Controller/Controller.php
Expand Up @@ -17,6 +17,7 @@
use Cake\Controller\Exception\MissingActionException;
use Cake\Datasource\ModelAwareTrait;
use Cake\Event\Event;
use Cake\Event\EventDispatcherInterface;
use Cake\Event\EventListenerInterface;
use Cake\Event\EventManagerTrait;
use Cake\Log\LogTrait;
Expand Down Expand Up @@ -80,7 +81,7 @@
* @property \Cake\Controller\Component\SecurityComponent $Security
* @link http://book.cakephp.org/3.0/en/controllers.html
*/
class Controller implements EventListenerInterface
class Controller implements EventListenerInterface, EventDispatcherInterface
{

use EventManagerTrait;
Expand Down
3 changes: 2 additions & 1 deletion src/Datasource/RulesAwareTrait.php
Expand Up @@ -17,6 +17,7 @@
use ArrayObject;
use Cake\Datasource\EntityInterface;
use Cake\Datasource\RulesChecker;
use Cake\Event\EventDispatcherInterface;

/**
* A trait that allows a class to build and apply application.
Expand Down Expand Up @@ -51,7 +52,7 @@ public function checkRules(EntityInterface $entity, $operation = RulesChecker::C
$rules = $this->rulesChecker();
$options = $options ?: new ArrayObject;
$options = is_array($options) ? new ArrayObject($options) : $options;
$hasEvents = method_exists($this, 'dispatchEvent');
$hasEvents = ($this instanceof EventDispatcherInterface);

if ($hasEvents) {
$event = $this->dispatchEvent(
Expand Down
55 changes: 55 additions & 0 deletions src/Event/EventDispatcherInterface.php
@@ -0,0 +1,55 @@
<?php
/**
* CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://cakephp.org CakePHP(tm) Project
* @since 3.0.7
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Event;

use Cake\Event\EventManager;

/**
* Objects implementing this interface can emit events.
*
* Objects with this interface can trigger events, and have
* an event manager retrieved from them.
*
* The Cake\Event\EventManagerTrait lets you easily implement
* this interface.
*/
interface EventDispatcherInterface
{
/**
* Wrapper for creating and dispatching events.
*
* Returns a dispatched event.
*
* @param string $name Name of the event.
* @param array|null $data Any value you wish to be transported with this event to
* it can be read by listeners.
* @param object|null $subject The object that this event applies to
* ($this by default).
*
* @return \Cake\Event\Event
*/
public function dispatchEvent($name, $data = null, $subject = null);

/**
* Returns the Cake\Event\EventManager manager instance for this object.
*
* You can use this instance to register any new listeners or callbacks to the
* object events, or create your own events and trigger them at will.
*
* @param \Cake\Event\EventManager|null $eventManager the eventManager to set
* @return \Cake\Event\EventManager
*/
public function eventManager(EventManager $eventManager = null);
}
3 changes: 2 additions & 1 deletion src/ORM/Table.php
Expand Up @@ -24,6 +24,7 @@
use Cake\Datasource\Exception\InvalidPrimaryKeyException;
use Cake\Datasource\RepositoryInterface;
use Cake\Datasource\RulesAwareTrait;
use Cake\Event\EventDispatcherInterface;
use Cake\Event\EventListenerInterface;
use Cake\Event\EventManager;
use Cake\Event\EventManagerTrait;
Expand Down Expand Up @@ -118,7 +119,7 @@
*
* @see \Cake\Event\EventManager for reference on the events system.
*/
class Table implements RepositoryInterface, EventListenerInterface
class Table implements RepositoryInterface, EventListenerInterface, EventDispatcherInterface
{

use EventManagerTrait;
Expand Down
3 changes: 2 additions & 1 deletion src/Validation/ValidatorAwareTrait.php
Expand Up @@ -14,6 +14,7 @@
*/
namespace Cake\Validation;

use Cake\Event\EventDispatcherInterface;
use Cake\Validation\Validator;

/**
Expand Down Expand Up @@ -96,7 +97,7 @@ public function validator($name = null, Validator $validator = null)
if ($validator === null) {
$validator = new Validator();
$validator = $this->{'validation' . ucfirst($name)}($validator);
if (method_exists($this, 'dispatchEvent')) {
if ($this instanceof EventDispatcherInterface) {
$this->dispatchEvent('Model.buildValidator', compact('validator', 'name'));
}
}
Expand Down
3 changes: 2 additions & 1 deletion src/View/View.php
Expand Up @@ -17,6 +17,7 @@
use Cake\Cache\Cache;
use Cake\Core\App;
use Cake\Core\Plugin;
use Cake\Event\EventDispatcherInterface;
use Cake\Event\EventManager;
use Cake\Event\EventManagerTrait;
use Cake\Log\LogTrait;
Expand Down Expand Up @@ -56,7 +57,7 @@
* @property \Cake\View\Helper\TimeHelper $Time
* @property \Cake\View\ViewBlock $Blocks
*/
class View
class View implements EventDispatcherInterface
{

use CellTrait;
Expand Down

0 comments on commit 60f955a

Please sign in to comment.