]>
Commit | Line | Data |
---|---|---|
4f5b44bd NL |
1 | <?php |
2 | ||
3 | /* | |
4 | * This file is part of the Symfony package. | |
5 | * | |
6 | * (c) Fabien Potencier <fabien@symfony.com> | |
7 | * | |
8 | * For the full copyright and license information, please view the LICENSE | |
9 | * file that was distributed with this source code. | |
10 | */ | |
11 | ||
12 | namespace Symfony\Component\Routing\Matcher; | |
13 | ||
14 | use Symfony\Component\Routing\Exception\ResourceNotFoundException; | |
15 | use Symfony\Component\Routing\Route; | |
16 | ||
17 | /** | |
18 | * @author Fabien Potencier <fabien@symfony.com> | |
19 | * | |
20 | * @api | |
21 | */ | |
22 | abstract class RedirectableUrlMatcher extends UrlMatcher implements RedirectableUrlMatcherInterface | |
23 | { | |
24 | /** | |
25 | * {@inheritdoc} | |
26 | */ | |
27 | public function match($pathinfo) | |
28 | { | |
29 | try { | |
30 | $parameters = parent::match($pathinfo); | |
31 | } catch (ResourceNotFoundException $e) { | |
32 | if ('/' === substr($pathinfo, -1) || !in_array($this->context->getMethod(), array('HEAD', 'GET'))) { | |
33 | throw $e; | |
34 | } | |
35 | ||
36 | try { | |
37 | parent::match($pathinfo.'/'); | |
38 | ||
39 | return $this->redirect($pathinfo.'/', null); | |
40 | } catch (ResourceNotFoundException $e2) { | |
41 | throw $e; | |
42 | } | |
43 | } | |
44 | ||
45 | return $parameters; | |
46 | } | |
47 | ||
48 | /** | |
49 | * {@inheritDoc} | |
50 | */ | |
51 | protected function handleRouteRequirements($pathinfo, $name, Route $route) | |
52 | { | |
53 | // check HTTP scheme requirement | |
54 | $scheme = $route->getRequirement('_scheme'); | |
55 | if ($scheme && $this->context->getScheme() !== $scheme) { | |
56 | return array(self::ROUTE_MATCH, $this->redirect($pathinfo, $name, $scheme)); | |
57 | } | |
58 | ||
59 | return array(self::REQUIREMENT_MATCH, null); | |
60 | } | |
61 | } |