Browse Source

Merge pull request #15887 from cakephp/4.next-component-shutdown-depr

4.3: Consolidate event names. Backport
Mark Story 4 years ago
parent
commit
a81efac0ea

+ 10 - 5
src/Controller/Component.php

@@ -37,13 +37,13 @@ use Cake\Log\LogTrait;
  * cycle. The available callbacks are:
  *
  * - `beforeFilter(EventInterface $event)`
- *   Called before the controller's beforeFilter method by default.
+ *   Called before Controller::beforeFilter() method by default.
  * - `startup(EventInterface $event)`
- *   Called after the controller's beforeFilter method, and before the
+ *   Called after Controller::beforeFilter() method, and before the
  *   controller action is called.
  * - `beforeRender(EventInterface $event)`
- *   Called before the Controller beforeRender, and before the view class is loaded.
- * - `shutdown(EventInterface $event)`
+ *   Called before Controller::beforeRender(), and before the view class is loaded.
+ * - `afterFilter(EventInterface $event)`
  *   Called after the action is complete and the view has been rendered but
  *   before Controller::afterFilter().
  * - `beforeRedirect(EventInterface $event $url, Response $response)`
@@ -170,7 +170,7 @@ class Component implements EventListenerInterface
             'Controller.startup' => 'startup',
             'Controller.beforeRender' => 'beforeRender',
             'Controller.beforeRedirect' => 'beforeRedirect',
-            'Controller.shutdown' => 'shutdown',
+            'Controller.shutdown' => 'afterFilter',
         ];
         $events = [];
         foreach ($eventMap as $event => $method) {
@@ -179,6 +179,11 @@ class Component implements EventListenerInterface
             }
         }
 
+        if (!isset($events['Controller.shutdown']) && method_exists($this, 'shutdown')) {
+            deprecationWarning('`Controller.shutdown` event callback is now `afterFilter()` instead of `shutdown()`.');
+            $events[$event] = 'shutdown';
+        }
+
         return $events;
     }
 

+ 23 - 0
tests/TestCase/Controller/ComponentTest.php

@@ -28,6 +28,7 @@ use TestApp\Controller\Component\BananaComponent;
 use TestApp\Controller\Component\ConfiguredComponent;
 use TestApp\Controller\Component\OrangeComponent;
 use TestApp\Controller\Component\SomethingWithFlashComponent;
+use TestApp\Controller\Component\TestShutdownComponent;
 use TestApp\Controller\ComponentTestController;
 
 /**
@@ -248,6 +249,28 @@ class ComponentTest extends TestCase
     }
 
     /**
+     * Tests deprecated shutdown callback
+     */
+    public function testEventShutdown(): void
+    {
+        $Collection = new ComponentRegistry();
+
+        $this->deprecated(function () use ($Collection): void {
+            $Component = new TestShutdownComponent($Collection);
+            $result = $Component->__debugInfo();
+
+            $expected = [
+                'components' => [],
+                'implementedEvents' => [
+                    'Controller.shutdown' => 'shutdown',
+                ],
+                '_config' => [],
+            ];
+            $this->assertEquals($expected, $result);
+        });
+    }
+
+    /**
      * Test that calling getController() without setting a controller throws exception
      */
     public function testGetControllerException(): void

+ 21 - 0
tests/test_app/TestApp/Controller/Component/TestShutdownComponent.php

@@ -0,0 +1,21 @@
+<?php
+declare(strict_types=1);
+
+namespace TestApp\Controller\Component;
+
+use Cake\Controller\Component;
+use Cake\Event\EventInterface;
+
+/**
+ * Tests deprecated shutdown callback
+ */
+class TestShutdownComponent extends Component
+{
+    /**
+     * @param \Cake\Event\EventInterface $event
+     * @return void
+     */
+    public function shutdown(EventInterface $event): void
+    {
+    }
+}