Browse Source

adds methods for Events with deprecate warnings for data property

thinkingmedia 9 years ago
parent
commit
9ada469801

+ 4 - 4
src/Controller/Component/AuthComponent.php

@@ -713,8 +713,8 @@ class AuthComponent extends Component
             if (!empty($result) && is_array($result)) {
                 $this->_authenticationProvider = $auth;
                 $event = $this->dispatchEvent('Auth.afterIdentify', [$result, $auth]);
-                if ($event->result !== null) {
-                    $result = $event->result;
+                if ($event->result() !== null) {
+                    $result = $event->result();
                 }
                 $this->storage()->write($result);
 
@@ -787,8 +787,8 @@ class AuthComponent extends Component
             if (!empty($result)) {
                 $this->_authenticationProvider = $auth;
                 $event = $this->dispatchEvent('Auth.afterIdentify', [$result, $auth]);
-                if ($event->result !== null) {
-                    return $event->result;
+                if ($event->result() !== null) {
+                    return $event->result();
                 }
 
                 return $result;

+ 12 - 10
src/Controller/Controller.php

@@ -495,13 +495,14 @@ class Controller implements EventListenerInterface, EventDispatcherInterface
     public function startupProcess()
     {
         $event = $this->dispatchEvent('Controller.initialize');
-        if ($event->result instanceof Response) {
-            return $event->result;
+        if ($event->result() instanceof Response) {
+            return $event->result();
         }
         $event = $this->dispatchEvent('Controller.startup');
-        if ($event->result instanceof Response) {
-            return $event->result;
+        if ($event->result() instanceof Response) {
+            return $event->result();
         }
+        return null;
     }
 
     /**
@@ -516,9 +517,10 @@ class Controller implements EventListenerInterface, EventDispatcherInterface
     public function shutdownProcess()
     {
         $event = $this->dispatchEvent('Controller.shutdown');
-        if ($event->result instanceof Response) {
-            return $event->result;
+        if ($event->result() instanceof Response) {
+            return $event->result();
         }
+        return null;
     }
 
     /**
@@ -540,8 +542,8 @@ class Controller implements EventListenerInterface, EventDispatcherInterface
         }
 
         $event = $this->dispatchEvent('Controller.beforeRedirect', [$url, $response]);
-        if ($event->result instanceof Response) {
-            return $event->result;
+        if ($event->result() instanceof Response) {
+            return $event->result();
         }
         if ($event->isStopped()) {
             return null;
@@ -600,8 +602,8 @@ class Controller implements EventListenerInterface, EventDispatcherInterface
         $this->autoRender = false;
 
         $event = $this->dispatchEvent('Controller.beforeRender');
-        if ($event->result instanceof Response) {
-            return $event->result;
+        if ($event->result() instanceof Response) {
+            return $event->result();
         }
         if ($event->isStopped()) {
             return $this->response;

+ 1 - 1
src/Error/ExceptionRenderer.php

@@ -386,6 +386,6 @@ class ExceptionRenderer
         ];
         $result = $dispatcher->dispatchEvent('Dispatcher.afterDispatch', $args);
 
-        return $result->data['response'];
+        return $result->data('response');
     }
 }

+ 88 - 9
src/Event/Event.php

@@ -18,8 +18,13 @@ namespace Cake\Event;
  * Represents the transport class of events across the system. It receives a name, subject and an optional
  * payload. The name can be any string that uniquely identifies the event across the application, while the subject
  * represents the object that the event applies to.
+ *
+ * @property string $name Name of the event
+ * @property object $subject The object this event applies to
+ * @property mixed $result Property used to retain the result value of the event listeners
+ * @property array $data Custom data for the method that receives the event
  */
-class Event
+class Event implements EventInterface
 {
 
     /**
@@ -39,16 +44,16 @@ class Event
     /**
      * Custom data for the method that receives the event
      *
-     * @var mixed
+     * @var array
      */
-    public $data = null;
+    protected $_data;
 
     /**
      * Property used to retain the result value of the event listeners
      *
      * @var mixed
      */
-    public $result = null;
+    protected $_result = null;
 
     /**
      * Flags an event as stopped or not, default is false
@@ -73,13 +78,17 @@ class Event
      */
     public function __construct($name, $subject = null, $data = null)
     {
+        if ($data !== null && !is_array($data)) {
+            trigger_error('Data parameter will be changing to array hint typing', E_USER_DEPRECATED);
+        }
+
         $this->_name = $name;
-        $this->data = $data;
+        $this->_data = (array)$data;
         $this->_subject = $subject;
     }
 
     /**
-     * Dynamically returns the name and subject if accessed directly
+     * Provides read-only access for the name and subject properties.
      *
      * @param string $attribute Attribute name.
      * @return mixed
@@ -89,6 +98,36 @@ class Event
         if ($attribute === 'name' || $attribute === 'subject') {
             return $this->{$attribute}();
         }
+        if ($attribute === 'data')
+        {
+            trigger_error('Public read access to data is deprecated, use data()', E_USER_DEPRECATED);
+            return $this->_data;
+        }
+        if ($attribute === 'result')
+        {
+            trigger_error('Public read access to result is deprecated, use result()', E_USER_DEPRECATED);
+            return $this->_result;
+        }
+    }
+
+    /**
+     * Provides backward compatibility for write access to data and result properties.
+     *
+     * @param string $attribute Attribute name.
+     * @param mixed $value
+     */
+    public function __set($attribute, $value)
+    {
+        if($attribute === 'data')
+        {
+            trigger_error('Public write access to data is deprecated, use setData()', E_USER_DEPRECATED);
+            $this->_data = (array)$value;
+        }
+        if ($attribute === 'result')
+        {
+            trigger_error('Public write access to result is deprecated, use setResult()', E_USER_DEPRECATED);
+            $this->_result = $value;
+        }
     }
 
     /**
@@ -132,12 +171,52 @@ class Event
     }
 
     /**
+     * The result value of the event listeners
+     *
+     * @return mixed
+     */
+    public function result()
+    {
+        return $this->_result;
+    }
+
+    /**
+     * @param null $value
+     * @return $this
+     */
+    public function setResult($value = null)
+    {
+        $this->_result = $value;
+        return $this;
+    }
+
+    /**
      * Access the event data/payload.
      *
-     * @return array
+     * @param string|null $key
+     * @return array|null The data payload if $key is null, or the data value for the given $key. If the $key does not
+     * exist a null value is returned.
+     */
+    public function data($key = null)
+    {
+        if ($key !== null) {
+            return isset($this->_data[$key]) ? $this->_data[$key] : null;
+        }
+        return (array)$this->_data;
+    }
+
+    /**
+     * @param array|string $key
+     * @param mixed $value
+     * @return $this
      */
-    public function data()
+    public function setData($key, $value = null)
     {
-        return (array)$this->data;
+        if(is_array($key)) {
+            $this->_data = $key;
+        } else {
+            $this->_data[$key] = $value;
+        }
+        return $this;
     }
 }

+ 82 - 0
src/Event/EventInterface.php

@@ -0,0 +1,82 @@
+<?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.3.2
+ * @license       http://www.opensource.org/licenses/mit-license.php MIT License
+ */
+namespace Cake\Event;
+
+/**
+ * Represents the transport interface for events across the system.
+ */
+interface EventInterface
+{
+    /**
+     * Access the event data/payload.
+     *
+     * @param string|null $key The string identifier for the data payload, or if null all of the payload is returned.
+     * @return array|null The data payload if $key is null, or the data value for the given $key. If the $key does not
+     * exist a null value should be returned.
+     */
+    public function data($key = null);
+
+    /**
+     * Check if the event is stopped
+     *
+     * @return bool True if the event is stopped
+     */
+    public function isStopped();
+
+    /**
+     * Returns the name of this event. This is usually used as the event identifier
+     *
+     * @return string
+     */
+    public function name();
+
+    /**
+     * The result value of the event listeners
+     *
+     * @return mixed
+     */
+    public function result();
+
+    /**
+     * Modify the event data/payload.
+     *
+     * @param array|string $key The string identifier to be modified, or an array to replace the payload.
+     * @param mixed $value The payload value to be modified if $key is a string, otherwise ignored.
+     * @return $this
+     */
+    public function setData($key, $value = null);
+
+    /**
+     * Assigns a result value for the event listener. If a result has already be assigned it will be overwritten.
+     *
+     * @param mixed $value
+     * @return $this
+     */
+    public function setResult($value = null);
+
+    /**
+     * Stops the event from being used anymore
+     *
+     * @return void
+     */
+    public function stopPropagation();
+
+    /**
+     * Returns the subject of this event
+     *
+     * @return object
+     */
+    public function subject();
+}

+ 1 - 1
src/Event/EventManager.php

@@ -393,7 +393,7 @@ class EventManager
                 $event->stopPropagation();
             }
             if ($result !== null) {
-                $event->result = $result;
+                $event->setResult($result);
             }
         }
 

+ 6 - 6
src/Http/ActionDispatcher.php

@@ -80,15 +80,15 @@ class ActionDispatcher
         }
         $beforeEvent = $this->dispatchEvent('Dispatcher.beforeDispatch', compact('request', 'response'));
 
-        $request = $beforeEvent->data['request'];
-        if ($beforeEvent->result instanceof Response) {
-            return $beforeEvent->result;
+        $request = $beforeEvent->data('request');
+        if ($beforeEvent->result() instanceof Response) {
+            return $beforeEvent->result();
         }
 
         // Use the controller built by an beforeDispatch
         // event handler if there is one.
-        if (isset($beforeEvent->data['controller'])) {
-            $controller = $beforeEvent->data['controller'];
+        if ($beforeEvent->data('controller') instanceof Controller) {
+            $controller = $beforeEvent->data('controller');
         } else {
             $controller = $this->factory->create($request, $response);
         }
@@ -100,7 +100,7 @@ class ActionDispatcher
 
         $afterEvent = $this->dispatchEvent('Dispatcher.afterDispatch', compact('request', 'response'));
 
-        return $afterEvent->data['response'];
+        return $afterEvent->data('response');
     }
 
     /**

+ 2 - 2
src/ORM/Table.php

@@ -1542,7 +1542,7 @@ class Table implements RepositoryInterface, EventListenerInterface, EventDispatc
         $event = $this->dispatchEvent('Model.beforeSave', compact('entity', 'options'));
 
         if ($event->isStopped()) {
-            return $event->result;
+            return $event->result();
         }
 
         $saved = $this->_associations->saveParents(
@@ -1879,7 +1879,7 @@ class Table implements RepositoryInterface, EventListenerInterface, EventDispatc
         ]);
 
         if ($event->isStopped()) {
-            return $event->result;
+            return $event->result();
         }
 
         $this->_associations->cascadeDelete(

+ 2 - 2
src/Routing/DispatcherFilter.php

@@ -156,7 +156,7 @@ class DispatcherFilter implements EventListenerInterface
      */
     public function matches(Event $event)
     {
-        $request = $event->data['request'];
+        $request = $event->data('request');
         $pass = true;
         if (!empty($this->_config['for'])) {
             $len = strlen('preg:');
@@ -169,7 +169,7 @@ class DispatcherFilter implements EventListenerInterface
             }
         }
         if ($pass && !empty($this->_config['when'])) {
-            $response = $event->data['response'];
+            $response = $event->data('response');
             $pass = $this->_config['when']($request, $response);
         }
 

+ 2 - 2
src/Routing/Filter/AssetFilter.php

@@ -66,7 +66,7 @@ class AssetFilter extends DispatcherFilter
      */
     public function beforeDispatch(Event $event)
     {
-        $request = $event->data['request'];
+        $request = $event->data('request');
 
         $url = urldecode($request->url);
         if (strpos($url, '..') !== false || strpos($url, '.') === false) {
@@ -77,7 +77,7 @@ class AssetFilter extends DispatcherFilter
         if ($assetFile === null || !file_exists($assetFile)) {
             return null;
         }
-        $response = $event->data['response'];
+        $response = $event->data('response');
         $event->stopPropagation();
 
         $response->modified(filemtime($assetFile));

+ 1 - 1
src/Routing/Filter/LocaleSelectorFilter.php

@@ -58,7 +58,7 @@ class LocaleSelectorFilter extends DispatcherFilter
      */
     public function beforeDispatch(Event $event)
     {
-        $request = $event->data['request'];
+        $request = $event->data('request');
         $locale = Locale::acceptFromHttp($request->header('Accept-Language'));
 
         if (!$locale || (!empty($this->_locales) && !in_array($locale, $this->_locales))) {

+ 2 - 2
src/View/View.php

@@ -967,8 +967,8 @@ class View implements EventDispatcherInterface
         $content = $this->_evaluate($viewFile, $data);
 
         $afterEvent = $this->dispatchEvent('View.afterRenderFile', [$viewFile, $content]);
-        if (isset($afterEvent->result)) {
-            $content = $afterEvent->result;
+        if ($afterEvent->result() !== null) {
+            $content = $afterEvent->result();
         }
 
         if (isset($this->_parents[$viewFile])) {

+ 1 - 1
tests/TestCase/Event/EventManagerTest.php

@@ -425,7 +425,7 @@ class EventManagerTest extends TestCase
             ->method('listenerFunction')
             ->with($event);
         $manager->dispatch($event);
-        $this->assertEquals('something special', $event->result);
+        $this->assertEquals('something special', $event->result());
     }
 
     /**

+ 2 - 2
tests/TestCase/Event/EventTest.php

@@ -90,7 +90,7 @@ class EventTest extends TestCase
     public function testEventDirectPropertyAccess()
     {
         $event = new Event('fake.event', $this);
-        $this->assertEquals($this, $event->subject);
-        $this->assertEquals('fake.event', $event->name);
+        $this->assertEquals($this, $event->subject());
+        $this->assertEquals('fake.event', $event->name());
     }
 }

+ 2 - 2
tests/TestCase/Routing/Filter/ControllerFactoryFilterTest.php

@@ -46,7 +46,7 @@ class ControllerFactoryFilterTest extends TestCase
 
         $this->assertEquals(
             'TestApp\Controller\Admin\PostsController',
-            get_class($event->data['controller'])
+            get_class($event->data('controller'))
         );
 
         $request->addParams(['prefix' => 'admin/sub', 'controller' => 'Posts', 'action' => 'index']);
@@ -55,7 +55,7 @@ class ControllerFactoryFilterTest extends TestCase
 
         $this->assertEquals(
             'TestApp\Controller\Admin\Sub\PostsController',
-            get_class($event->data['controller'])
+            get_class($event->data('controller'))
         );
     }
 }

+ 3 - 3
tests/test_app/Plugin/TestPlugin/src/Routing/Filter/Test2DispatcherFilter.php

@@ -25,14 +25,14 @@ class Test2DispatcherFilter extends DispatcherFilter
 
     public function beforeDispatch(Event $event)
     {
-        $event->data['response']->statusCode(500);
+        $event->data('response')->statusCode(500);
         $event->stopPropagation();
 
-        return $event->data['response'];
+        return $event->data('response');
     }
 
     public function afterDispatch(Event $event)
     {
-        $event->data['response']->statusCode(200);
+        $event->data('response')->statusCode(200);
     }
 }

+ 2 - 2
tests/test_app/Plugin/TestPlugin/src/Routing/Filter/TestDispatcherFilter.php

@@ -25,11 +25,11 @@ class TestDispatcherFilter extends DispatcherFilter
 
     public function beforeDispatch(Event $event)
     {
-        $event->data['request']->params['altered'] = true;
+        $event->data('request')->params['altered'] = true;
     }
 
     public function afterDispatch(Event $event)
     {
-        $event->data['response']->statusCode(304);
+        $event->data('response')->statusCode(304);
     }
 }

+ 1 - 1
tests/test_app/TestApp/Auth/TestAuthenticate.php

@@ -44,7 +44,7 @@ class TestAuthenticate extends BaseAuthenticate
     public function afterIdentify(Event $event, array $user)
     {
         $this->callStack[] = __FUNCTION__;
-        $this->authenticationProvider = $event->data[1];
+        $this->authenticationProvider = $event->data(1);
 
         if (!empty($this->modifiedUser)) {
             return $user + ['extra' => 'foo'];