Przeglądaj źródła

[Routing] added RedirectableUrlMatcher

Fabien Potencier 14 lat temu
rodzic
commit
fd1636b324

+ 49 - 0
src/Symfony/Component/Routing/Matcher/RedirectableUrlMatcher.php

@@ -0,0 +1,49 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Matcher;
+
+use Symfony\Component\Routing\Matcher\Exception\NotFoundException;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+abstract class RedirectableUrlMatcher extends UrlMatcher implements RedirectableUrlMatcherInterface
+{
+    private $trailingSlashTest = false;
+
+    /**
+     * @see UrlMatcher::match()
+     */
+    public function match($pathinfo)
+    {
+        try {
+            $parameters = parent::match($pathinfo);
+        } catch (NotFoundException $e) {
+            if ('/' === substr($pathinfo, -1)) {
+                throw $e;
+            }
+
+            // try with a / at the end
+            $this->trailingSlashTest = true;
+
+            return $this->match($pathinfo.'/');
+        }
+
+        if ($this->trailingSlashTest) {
+            $this->trailingSlashTest = false;
+
+            return $this->redirect($pathinfo, null);
+        }
+
+        return $parameters;
+    }
+}

+ 29 - 0
tests/Symfony/Tests/Component/Routing/Matcher/RedirectableUrlMatcherTest.php

@@ -0,0 +1,29 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Tests\Component\Routing\Matcher;
+
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Routing\RequestContext;
+
+class RedirectableUrlMatcherTest extends \PHPUnit_Framework_TestCase
+{
+    public function testNoMethodSoAllowed()
+    {
+        $coll = new RouteCollection();
+        $coll->add('foo', new Route('/foo/'));
+
+        $matcher = $this->getMockForAbstractClass('Symfony\Component\Routing\Matcher\RedirectableUrlMatcher', array($coll, new RequestContext()));
+        $matcher->expects($this->once())->method('redirect');
+        $matcher->match('/foo');
+    }
+}