Browse Source

Ensure the app is always last in the middleware stack.

By ensuring the app is always bound after the event, event listeners can
be less careful. Without this plugins would always have to use
insertBefore() which is kind of awkward.
Mark Story 9 years ago
parent
commit
f9e013eddc
2 changed files with 12 additions and 5 deletions
  1. 1 1
      src/Http/Server.php
  2. 11 4
      tests/TestCase/Http/ServerTest.php

+ 1 - 1
src/Http/Server.php

@@ -77,8 +77,8 @@ class Server
         if (!($middleware instanceof MiddlewareStack)) {
         if (!($middleware instanceof MiddlewareStack)) {
             throw new RuntimeException('The application `middleware` method did not return a middleware stack.');
             throw new RuntimeException('The application `middleware` method did not return a middleware stack.');
         }
         }
-        $middleware->push($this->app);
         $this->dispatchEvent('Server.buildMiddleware', ['middleware' => $middleware]);
         $this->dispatchEvent('Server.buildMiddleware', ['middleware' => $middleware]);
+        $middleware->push($this->app);
         $response = $this->runner->run($middleware, $request, $response);
         $response = $this->runner->run($middleware, $request, $response);
 
 
         if (!($response instanceof ResponseInterface)) {
         if (!($response instanceof ResponseInterface)) {

+ 11 - 4
tests/TestCase/Http/ServerTest.php

@@ -179,12 +179,19 @@ class ServerTest extends TestCase
     {
     {
         $app = new MiddlewareApplication($this->config);
         $app = new MiddlewareApplication($this->config);
         $server = new Server($app);
         $server = new Server($app);
-        $called = false;
-        $server->eventManager()->on('Server.buildMiddleware', function ($event, $middleware) use (&$called) {
-            $called = true;
+        $this->called = false;
+
+        $server->eventManager()->on('Server.buildMiddleware', function ($event, $middleware) {
             $this->assertInstanceOf('Cake\Http\MiddlewareStack', $middleware);
             $this->assertInstanceOf('Cake\Http\MiddlewareStack', $middleware);
+            $middleware->push(function ($req, $res, $next) {
+                $this->called = true;
+                return $next($req, $res);
+            });
+            $this->middleware = $middleware;
         });
         });
         $server->run();
         $server->run();
-        $this->assertTrue($called, 'Event not triggered.');
+        $this->assertTrue($this->called, 'Middleware added in the event was not triggered.');
+        $this->assertInstanceOf('Closure', $this->middleware->get(3), '2nd last middleware is a clousure');
+        $this->assertSame($app, $this->middleware->get(4), 'Last middleware is an app instance');
     }
     }
 }
 }