Browse Source

Update RoutingMiddleware to PSR 15 standard.

ADmad 7 years ago
parent
commit
4b6c3303b5

+ 9 - 13
src/Routing/Middleware/RoutingMiddleware.php

@@ -25,13 +25,15 @@ use Cake\Routing\RouteCollection;
 use Cake\Routing\Router;
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Server\MiddlewareInterface;
+use Psr\Http\Server\RequestHandlerInterface;
 use Zend\Diactoros\Response\RedirectResponse;
 
 /**
  * Applies routing rules to the request and creates the controller
  * instance if possible.
  */
-class RoutingMiddleware
+class RoutingMiddleware implements MiddlewareInterface
 {
     /**
      * Key used to store the route collection in the cache engine
@@ -119,15 +121,11 @@ class RoutingMiddleware
      * invoked.
      *
      * @param \Psr\Http\Message\ServerRequestInterface $request The request.
-     * @param \Psr\Http\Message\ResponseInterface $response The response.
-     * @param callable $next The next middleware to call.
-     * @return \Psr\Http\Message\ResponseInterface A response.
+     * @param \Psr\Http\Server\RequestHandlerInterface $handler The request handler.
+     * @return \Cake\Http\ResponseInterface A response.
      */
-    public function __invoke(
-        ServerRequestInterface $request,
-        ResponseInterface $response,
-        callable $next
-    ): ResponseInterface {
+    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
+    {
         $this->loadRoutes();
         try {
             Router::setRequestContext($request);
@@ -148,15 +146,13 @@ class RoutingMiddleware
         } catch (RedirectException $e) {
             return new RedirectResponse(
                 $e->getMessage(),
-                $e->getCode(),
-                $response->getHeaders()
+                $e->getCode()
             );
         }
         $matching = Router::getRouteCollection()->getMiddleware($middleware);
         if (!$matching) {
-            return $next($request, $response);
+            return $handler->process($request);
         }
-        $matching[] = $next;
         $middleware = new MiddlewareQueue($matching);
         $runner = new Runner();
 

+ 21 - 23
tests/TestCase/Routing/Middleware/RoutingMiddlewareTest.php

@@ -23,6 +23,7 @@ use Cake\Routing\RouteCollection;
 use Cake\Routing\Router;
 use Cake\TestSuite\TestCase;
 use TestApp\Application;
+use TestApp\Http\TestRequestHandler;
 use TestApp\Middleware\DumbMiddleware;
 use Zend\Diactoros\Response;
 use Zend\Diactoros\ServerRequest;
@@ -61,11 +62,9 @@ class RoutingMiddlewareTest extends TestCase
         $request = ServerRequestFactory::fromGlobals(['REQUEST_URI' => '/testpath']);
         $request = $request->withAttribute('base', '/subdir');
 
-        $response = new Response();
-        $next = function ($req, $res) {
-        };
+        $handler = new TestRequestHandler();
         $middleware = new RoutingMiddleware($this->app());
-        $response = $middleware($request, $response, $next);
+        $response = $middleware->process($request, $handler);
 
         $this->assertEquals(301, $response->getStatusCode());
         $this->assertEquals('http://localhost/subdir/pages', $response->getHeaderLine('Location'));
@@ -82,15 +81,14 @@ class RoutingMiddlewareTest extends TestCase
             $routes->redirect('/testpath', '/pages');
         });
         $request = ServerRequestFactory::fromGlobals(['REQUEST_URI' => '/testpath']);
-        $response = new Response('php://memory', 200, ['X-testing' => 'Yes']);
-        $next = function ($req, $res) {
-        };
+        $handler = new TestRequestHandler(function ($request) {
+            return new Response('php://memory', 200, ['X-testing' => 'Yes']);
+        });
         $middleware = new RoutingMiddleware($this->app());
-        $response = $middleware($request, $response, $next);
+        $response = $middleware->process($request, $handler);
 
         $this->assertEquals(301, $response->getStatusCode());
         $this->assertEquals('http://localhost/pages', $response->getHeaderLine('Location'));
-        $this->assertEquals('Yes', $response->getHeaderLine('X-testing'));
     }
 
     /**
@@ -115,7 +113,7 @@ class RoutingMiddlewareTest extends TestCase
             return $res;
         };
         $middleware = new RoutingMiddleware($this->app());
-        $middleware($request, $response, $next);
+        $middleware->process($request, $handler);
     }
 
     /**
@@ -142,7 +140,7 @@ class RoutingMiddlewareTest extends TestCase
             return $res;
         };
         $middleware = new RoutingMiddleware($this->app());
-        $middleware($request, $response, $next);
+        $middleware->process($request, $handler);
     }
 
     /**
@@ -172,7 +170,7 @@ class RoutingMiddlewareTest extends TestCase
         };
         $app = new Application(CONFIG);
         $middleware = new RoutingMiddleware($app);
-        $middleware($request, $response, $next);
+        $middleware->process($request, $handler);
     }
 
     /**
@@ -197,7 +195,7 @@ class RoutingMiddlewareTest extends TestCase
             ->method('pluginRoutes')
             ->with($this->isInstanceOf(RouteBuilder::class));
         $middleware = new RoutingMiddleware($app);
-        $middleware($request, $response, $next);
+        $middleware->process($request, $handler);
     }
 
     /**
@@ -216,7 +214,7 @@ class RoutingMiddlewareTest extends TestCase
             return $res;
         };
         $middleware = new RoutingMiddleware($this->app());
-        $middleware($request, $response, $next);
+        $middleware->process($request, $handler);
     }
 
     /**
@@ -232,7 +230,7 @@ class RoutingMiddlewareTest extends TestCase
             return $res;
         };
         $middleware = new RoutingMiddleware($this->app());
-        $middleware($request, $response, $next);
+        $middleware->process($request, $handler);
     }
 
     /**
@@ -271,7 +269,7 @@ class RoutingMiddlewareTest extends TestCase
             return $res;
         };
         $middleware = new RoutingMiddleware($this->app());
-        $middleware($request, $response, $next);
+        $middleware->process($request, $handler);
     }
 
     /**
@@ -311,7 +309,7 @@ class RoutingMiddlewareTest extends TestCase
             return $next($req, $res);
         };
         $middleware = new RoutingMiddleware($this->app());
-        $result = $middleware($request, $response, $next);
+        $result = $middleware->process($request, $handler);
         $this->assertSame(['second', 'first', 'last'], $this->log);
     }
 
@@ -355,7 +353,7 @@ class RoutingMiddlewareTest extends TestCase
             $this->fail('Should not be invoked as first should be ignored.');
         };
         $middleware = new RoutingMiddleware($this->app());
-        $result = $middleware($request, $response, $next);
+        $result = $middleware->process($request, $handler);
 
         $this->assertSame(['first', 'second'], $this->log);
     }
@@ -397,7 +395,7 @@ class RoutingMiddlewareTest extends TestCase
             $this->fail('Should not be invoked as second should be ignored.');
         };
         $middleware = new RoutingMiddleware($this->app());
-        $result = $middleware($request, $response, $next);
+        $result = $middleware->process($request, $handler);
 
         $this->assertSame(['first'], $this->log);
     }
@@ -447,7 +445,7 @@ class RoutingMiddlewareTest extends TestCase
             return $res;
         };
         $middleware = new RoutingMiddleware($this->app());
-        $result = $middleware($request, $response, $next);
+        $result = $middleware->process($request, $handler);
         $this->assertSame($expected, $this->log);
     }
 
@@ -486,7 +484,7 @@ class RoutingMiddlewareTest extends TestCase
         };
         $app = new Application(CONFIG);
         $middleware = new RoutingMiddleware($app, $cacheConfigName);
-        $middleware($request, $response, $next);
+        $middleware->process($request, $handler);
 
         Cache::clear($cacheConfigName);
         Cache::drop($cacheConfigName);
@@ -516,7 +514,7 @@ class RoutingMiddlewareTest extends TestCase
         };
         $app = new Application(CONFIG);
         $middleware = new RoutingMiddleware($app, $cacheConfigName);
-        $middleware($request, $response, $next);
+        $middleware->process($request, $handler);
 
         Cache::clear($cacheConfigName);
         Cache::drop($cacheConfigName);
@@ -544,7 +542,7 @@ class RoutingMiddlewareTest extends TestCase
         };
         $app = new Application(CONFIG);
         $middleware = new RoutingMiddleware($app, 'notfound');
-        $middleware($request, $response, $next);
+        $middleware->process($request, $handler);
 
         Cache::drop('_cake_router_');
     }

+ 5 - 2
tests/test_app/TestApp/Http/TestRequestHandler.php

@@ -13,6 +13,7 @@ declare(strict_types=1);
  */
 namespace TestApp\Http;
 
+use Cake\Http\Response;
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ServerRequestInterface;
 use Psr\Http\Server\RequestHandlerInterface;
@@ -21,9 +22,11 @@ class TestRequestHandler implements RequestHandlerInterface
 {
     public $callable;
 
-    public function __construct(callable $callable)
+    public function __construct(?callable $callable = null)
     {
-        $this->callable = $callable;
+        $this->callable = $callable ?: function ($request) {
+            return new Response();
+        };
     }
 
     public function handle(ServerRequestInterface $request): ResponseInterface