[Routing] added RedirectableUrlMatcher
This commit is contained in:
parent
1df8b2ee37
commit
fd1636b324
@ -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');
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user