Browse Source

Merge pull request #16180 from pabloelcolombiano/4.next

Inject the server request in the DI container per default
Mark Story 4 years ago
parent
commit
bff515db12

+ 2 - 3
src/Controller/ControllerFactory.php

@@ -79,10 +79,9 @@ class ControllerFactory implements ControllerFactoryInterface, RequestHandlerInt
             throw $this->missingController($request);
         }
 
-        // If the controller has a container definition
-        // add the request as a service.
+        // Get the controller from the container if defined.
+        // The request is in the container by default.
         if ($this->container->has($className)) {
-            $this->container->add(ServerRequest::class, $request);
             $controller = $this->container->get($className);
         } else {
             $controller = $reflection->newInstance($request);

+ 5 - 2
src/Http/BaseApplication.php

@@ -294,7 +294,7 @@ abstract class BaseApplication implements
     /**
      * Invoke the application.
      *
-     * - Convert the PSR response into CakePHP equivalents.
+     * - Add the request to the container, enabling its injection into other services.
      * - Create the controller that will handle this request.
      * - Invoke the controller.
      *
@@ -304,8 +304,11 @@ abstract class BaseApplication implements
     public function handle(
         ServerRequestInterface $request
     ): ResponseInterface {
+        $container = $this->getContainer();
+        $container->add(ServerRequest::class, $request);
+
         if ($this->controllerFactory === null) {
-            $this->controllerFactory = new ControllerFactory($this->getContainer());
+            $this->controllerFactory = new ControllerFactory($container);
         }
 
         if (Router::getRequest() !== $request) {

+ 9 - 8
tests/TestCase/Controller/ControllerFactoryTest.php

@@ -269,7 +269,16 @@ class ControllerFactoryTest extends TestCase
      */
     public function testCreateWithContainerDependenciesWithController(): void
     {
+        $request = new ServerRequest([
+            'url' => 'test_plugin_three/dependencies/index',
+            'params' => [
+                'plugin' => null,
+                'controller' => 'Dependencies',
+                'action' => 'index',
+            ],
+        ]);
         $this->container->add(stdClass::class, json_decode('{"key":"value"}'));
+        $this->container->add(ServerRequest::class, $request);
         $this->container->add(DependenciesController::class)
             ->addArgument(ServerRequest::class)
             ->addArgument(null)
@@ -278,14 +287,6 @@ class ControllerFactoryTest extends TestCase
             ->addArgument(null)
             ->addArgument(stdClass::class);
 
-        $request = new ServerRequest([
-            'url' => 'test_plugin_three/dependencies/index',
-            'params' => [
-                'plugin' => null,
-                'controller' => 'Dependencies',
-                'action' => 'index',
-            ],
-        ]);
         $controller = $this->factory->create($request);
         $this->assertInstanceOf(DependenciesController::class, $controller);
         $this->assertSame($controller->inject, $this->container->get(stdClass::class));

+ 2 - 0
tests/TestCase/Http/BaseApplicationTest.php

@@ -22,6 +22,7 @@ use Cake\Core\Container;
 use Cake\Core\ContainerInterface;
 use Cake\Http\BaseApplication;
 use Cake\Http\MiddlewareQueue;
+use Cake\Http\ServerRequest;
 use Cake\Http\ServerRequestFactory;
 use Cake\Routing\RouteBuilder;
 use Cake\Routing\RouteCollection;
@@ -74,6 +75,7 @@ class BaseApplicationTest extends TestCase
         $result = $app->handle($request);
         $this->assertInstanceOf(ResponseInterface::class, $result);
         $this->assertSame('Hello Jane', '' . $result->getBody());
+        $this->assertSame($request, $app->getContainer()->get(ServerRequest::class));
     }
 
     /**