]> git.agnieray.net Git - galette.git/commitdiff
Move trailing slash to middleware class
authorJohan Cwiklinski <johan@x-tnd.be>
Wed, 6 May 2020 16:20:28 +0000 (18:20 +0200)
committerJohan Cwiklinski <johan@x-tnd.be>
Wed, 6 May 2020 20:55:23 +0000 (22:55 +0200)
refs #1354 #1355

galette/includes/main.inc.php
galette/lib/Galette/Middleware/TrailingSlash.php [new file with mode: 0644]

index 9d4c41c15ea3980b029f7a6bb45e698c6bbf98ed..daf2324b7bc3bebc76ddda21e976b8234f09facf 100644 (file)
@@ -287,23 +287,7 @@ if ('MAINT' === GALETTE_MODE && !$container->get('login')->isSuperAdmin()) {
 /**
  * Trailing slash middleware
  */
-$app->add(function ($request, $response, $next) {
-    $uri = $request->getUri();
-    $path = $uri->getPath();
-    if ($path != '/' && substr($path, -1) == '/') {
-        // permanently redirect paths with a trailing slash
-        // to their non-trailing counterpart
-        $uri = $uri->withPath(substr($path, 0, -1));
-
-        if ($request->getMethod() == 'GET') {
-            return $response->withRedirect((string)$uri, 301);
-        } else {
-            return $next($request->withUri($uri), $response);
-        }
-    }
-
-    return $next($request, $response);
-});
+$app->add('\Galette\Middleware\TrailingSlash');
 
 /**
  * Change language middleware
diff --git a/galette/lib/Galette/Middleware/TrailingSlash.php b/galette/lib/Galette/Middleware/TrailingSlash.php
new file mode 100644 (file)
index 0000000..52c8137
--- /dev/null
@@ -0,0 +1,83 @@
+<?php
+
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Galette Slim middleware to handle trailing slash in URLs
+ *
+ * PHP version 5
+ *
+ * Copyright © 2020 The Galette Team
+ *
+ * This file is part of Galette (http://galette.tuxfamily.org).
+ *
+ * Galette is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Galette is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Galette. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category  Core
+ * @package   Galette
+ *
+ * @author    Johan Cwiklinski <johan@x-tnd.be>
+ * @copyright 2020 The Galette Team
+ * @license   http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
+ * @link      http://galette.tuxfamily.org
+ * @since     Available since 0.9.4dev - 2020-05-06
+ */
+
+namespace Galette\Middleware;
+
+use Psr\Http\Message\ServerRequestInterface as Request;
+use Psr\Http\Message\ResponseInterface as Response;
+
+/**
+ * Galette Slim middleware to handle trailing slash in URLs
+ *
+ * @category  Middleware
+ * @name      TrailingSlash
+ * @package   Galette
+ * @author    Johan Cwiklinski <johan@x-tnd.be>
+ * @copyright 2020 The Galette Team
+ * @license   http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
+ * @link      http://galette.tuxfamily.org
+ * @since     Available since 0.9.4dev - 2020-05-06
+ */
+class TrailingSlash
+{
+    /**
+     * Middleware invokable class
+     *
+     * @param  \Psr\Http\Message\ServerRequestInterface $request  PSR7 request
+     * @param  \Psr\Http\Message\ResponseInterface      $response PSR7 response
+     * @param  callable                                 $next     Next middleware
+     *
+     * @return \Psr\Http\Message\ResponseInterface
+     */
+    public function __invoke(Request $request, Response $response, $next) :Response
+    {
+        $uri = $request->getUri();
+        $path = $uri->getPath();
+        if ($path != '/' && substr($path, -1) == '/') {
+            // permanently redirect paths with a trailing slash
+            // to their non-trailing counterpart
+            $uri = $uri->withPath(substr($path, 0, -1));
+
+            if ($request->getMethod() == 'GET') {
+                return $response->withRedirect((string)$uri, 301);
+            } else {
+                return $next($request->withUri($uri), $response);
+            }
+        }
+
+        return $next($request, $response);
+    }
+}