Browse Source

Update LocaleSelectorMiddleware to PSR 15 standard.

ADmad 7 years ago
parent
commit
8dee2b10c6

+ 11 - 11
src/I18n/Middleware/LocaleSelectorMiddleware.php

@@ -18,13 +18,15 @@ use Cake\I18n\I18n;
 use Locale;
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Server\MiddlewareInterface;
+use Psr\Http\Server\RequestHandlerInterface;
 
 /**
  * Sets the runtime default locale for the request based on the
  * Accept-Language header. The default will only be set if it
  * matches the list of passed valid locales.
  */
-class LocaleSelectorMiddleware
+class LocaleSelectorMiddleware implements MiddlewareInterface
 {
     /**
      * List of valid locales for the request
@@ -45,19 +47,17 @@ class LocaleSelectorMiddleware
     }
 
     /**
+     * Set locale based on request headers.
+     *
      * @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
+    {
         $locale = Locale::acceptFromHttp($request->getHeaderLine('Accept-Language'));
         if (!$locale) {
-            return $next($request, $response);
+            return $handler->handle($request);
         }
         if ($this->locales !== ['*']) {
             $locale = Locale::lookup($this->locales, $locale, true);
@@ -66,6 +66,6 @@ class LocaleSelectorMiddleware
             I18n::setLocale($locale);
         }
 
-        return $next($request, $response);
+        return $handler->handle($request);
     }
 }

+ 8 - 16
tests/TestCase/I18n/Middleware/LocaleSelectorMiddlewareTest.php

@@ -19,6 +19,7 @@ use Cake\I18n\I18n;
 use Cake\I18n\Middleware\LocaleSelectorMiddleware;
 use Cake\TestSuite\TestCase;
 use Locale;
+use TestApp\Http\TestRequestHandler;
 use Zend\Diactoros\Response;
 use Zend\Diactoros\ServerRequestFactory;
 
@@ -36,9 +37,6 @@ class LocaleSelectorMiddlewareTest extends TestCase
     {
         parent::setUp();
         $this->locale = Locale::getDefault();
-        $this->next = function ($req, $res) {
-            return $res;
-        };
     }
 
     /**
@@ -61,15 +59,13 @@ class LocaleSelectorMiddlewareTest extends TestCase
     public function testInvokeNoAcceptedLocales()
     {
         $request = ServerRequestFactory::fromGlobals();
-        $response = new Response();
         $middleware = new LocaleSelectorMiddleware([]);
-        $middleware($request, $response, $this->next);
+        $middleware->process($request, new TestRequestHandler());
         $this->assertSame($this->locale, I18n::getLocale());
 
         $request = ServerRequestFactory::fromGlobals(['HTTP_ACCEPT_LANGUAGE' => 'garbage']);
-        $response = new Response();
         $middleware = new LocaleSelectorMiddleware([]);
-        $middleware($request, $response, $this->next);
+        $middleware->process($request, new TestRequestHandler());
         $this->assertSame($this->locale, I18n::getLocale());
     }
 
@@ -81,9 +77,8 @@ class LocaleSelectorMiddlewareTest extends TestCase
     public function testInvokeLocaleNotAccepted()
     {
         $request = ServerRequestFactory::fromGlobals(['HTTP_ACCEPT_LANGUAGE' => 'en-GB,en;q=0.8,es;q=0.6,da;q=0.4']);
-        $response = new Response();
         $middleware = new LocaleSelectorMiddleware(['en_CA', 'en_US', 'es']);
-        $middleware($request, $response, $this->next);
+        $middleware->process($request, new TestRequestHandler());
         $this->assertSame($this->locale, I18n::getLocale(), 'en-GB is not accepted');
     }
 
@@ -95,9 +90,8 @@ class LocaleSelectorMiddlewareTest extends TestCase
     public function testInvokeLocaleAccepted()
     {
         $request = ServerRequestFactory::fromGlobals(['HTTP_ACCEPT_LANGUAGE' => 'es,es-ES;q=0.8,da;q=0.4']);
-        $response = new Response();
         $middleware = new LocaleSelectorMiddleware(['en_CA', 'es']);
-        $middleware($request, $response, $this->next);
+        $middleware->process($request, new TestRequestHandler());
         $this->assertSame('es', I18n::getLocale(), 'es is accepted');
     }
 
@@ -109,9 +103,8 @@ class LocaleSelectorMiddlewareTest extends TestCase
     public function testInvokeLocaleAcceptedFallback()
     {
         $request = ServerRequestFactory::fromGlobals(['HTTP_ACCEPT_LANGUAGE' => 'es-ES;q=0.8,da;q=0.4']);
-        $response = new Response();
         $middleware = new LocaleSelectorMiddleware(['en_CA', 'es']);
-        $middleware($request, $response, $this->next);
+        $middleware->process($request, new TestRequestHandler());
         $this->assertSame('es', I18n::getLocale(), 'es is accepted');
     }
 
@@ -122,15 +115,14 @@ class LocaleSelectorMiddlewareTest extends TestCase
      */
     public function testInvokeLocaleAcceptAll()
     {
-        $response = new Response();
         $middleware = new LocaleSelectorMiddleware(['*']);
 
         $request = ServerRequestFactory::fromGlobals(['HTTP_ACCEPT_LANGUAGE' => 'es,es-ES;q=0.8,da;q=0.4']);
-        $middleware($request, $response, $this->next);
+        $middleware->process($request, new TestRequestHandler());
         $this->assertSame('es', I18n::getLocale(), 'es is accepted');
 
         $request = ServerRequestFactory::fromGlobals(['HTTP_ACCEPT_LANGUAGE' => 'en;q=0.4,es;q=0.6,da;q=0.8']);
-        $middleware($request, $response, $this->next);
+        $middleware->process($request, new TestRequestHandler());
         $this->assertSame('da', I18n::getLocale(), 'da is accepted');
     }
 }