ソースを参照

add DI container support for middleware queue

Kevin Pfeifer 3 年 前
コミット
2519a6e072

+ 1 - 1
src/Controller/ControllerFactory.php

@@ -106,7 +106,7 @@ class ControllerFactory implements ControllerFactoryInterface, RequestHandlerInt
         $middlewares = $controller->getMiddleware();
 
         if ($middlewares) {
-            $middlewareQueue = new MiddlewareQueue($middlewares);
+            $middlewareQueue = new MiddlewareQueue($middlewares, $this->container);
             $runner = new Runner();
 
             return $runner->run($middlewareQueue, $controller->getRequest(), $this);

+ 24 - 8
src/Http/MiddlewareQueue.php

@@ -17,6 +17,7 @@ declare(strict_types=1);
 namespace Cake\Http;
 
 use Cake\Core\App;
+use Cake\Core\ContainerInterface;
 use Cake\Http\Middleware\ClosureDecoratorMiddleware;
 use Cake\Http\Middleware\DoublePassDecoratorMiddleware;
 use Closure;
@@ -51,12 +52,19 @@ class MiddlewareQueue implements Countable, SeekableIterator
     protected $queue = [];
 
     /**
+     * @var \Cake\Core\ContainerInterface|null
+     */
+    protected $container;
+
+    /**
      * Constructor
      *
      * @param array $middleware The list of middleware to append.
+     * @param \Cake\Core\ContainerInterface $container Container instance.
      */
-    public function __construct(array $middleware = [])
+    public function __construct(array $middleware = [], ?ContainerInterface $container = null)
     {
+        $this->container = $container;
         $this->queue = $middleware;
     }
 
@@ -70,14 +78,22 @@ class MiddlewareQueue implements Countable, SeekableIterator
     protected function resolve($middleware): MiddlewareInterface
     {
         if (is_string($middleware)) {
-            $className = App::className($middleware, 'Middleware', 'Middleware');
-            if ($className === null) {
-                throw new RuntimeException(sprintf(
-                    'Middleware "%s" was not found.',
-                    $middleware
-                ));
+            if ($this->container && $this->container->has($middleware)) {
+                $middleware = $this->container->get($middleware);
+            }
+
+            if (is_string($middleware)) {
+                $className = App::className($middleware, 'Middleware', 'Middleware');
+                if ($className === null) {
+                    throw new RuntimeException(
+                        sprintf(
+                            'Middleware "%s" was not found.',
+                            $middleware
+                        )
+                    );
+                }
+                $middleware = new $className();
             }
-            $middleware = new $className();
         }
 
         if ($middleware instanceof MiddlewareInterface) {

+ 10 - 1
src/Http/Server.php

@@ -16,6 +16,7 @@ declare(strict_types=1);
  */
 namespace Cake\Http;
 
+use Cake\Core\ContainerApplicationInterface;
 use Cake\Core\HttpApplicationInterface;
 use Cake\Core\PluginApplicationInterface;
 use Cake\Event\EventDispatcherInterface;
@@ -80,7 +81,15 @@ class Server implements EventDispatcherInterface
 
         $request = $request ?: ServerRequestFactory::fromGlobals();
 
-        $middleware = $this->app->middleware($middlewareQueue ?? new MiddlewareQueue());
+        if ($middlewareQueue === null) {
+            if ($this->app instanceof ContainerApplicationInterface) {
+                $middlewareQueue = new MiddlewareQueue([], $this->app->getContainer());
+            } else {
+                $middlewareQueue = new MiddlewareQueue();
+            }
+        }
+
+        $middleware = $this->app->middleware($middlewareQueue);
         if ($this->app instanceof PluginApplicationInterface) {
             $middleware = $this->app->pluginMiddleware($middleware);
         }

+ 5 - 1
src/Routing/Middleware/RoutingMiddleware.php

@@ -18,6 +18,7 @@ namespace Cake\Routing\Middleware;
 
 use Cake\Cache\Cache;
 use Cake\Cache\Exception\InvalidArgumentException;
+use Cake\Core\ContainerApplicationInterface;
 use Cake\Core\PluginApplicationInterface;
 use Cake\Http\Exception\RedirectException;
 use Cake\Http\MiddlewareQueue;
@@ -187,7 +188,10 @@ class RoutingMiddleware implements MiddlewareInterface
             return $handler->handle($request);
         }
 
-        $middleware = new MiddlewareQueue($matching);
+        $container = $this->app instanceof ContainerApplicationInterface
+            ? $this->app->getContainer()
+            : null;
+        $middleware = new MiddlewareQueue($matching, $container);
         $runner = new Runner();
 
         return $runner->run($middleware, $request, $handler);