Skip to content

Commit

Permalink
[Routing] added RedirectableUrlMatcher
Browse files Browse the repository at this point in the history
  • Loading branch information
fabpot committed Apr 20, 2011
1 parent 1df8b2e commit fd1636b
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 0 deletions.
49 changes: 49 additions & 0 deletions 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;
}
}
@@ -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');
}
}

0 comments on commit fd1636b

Please sign in to comment.