diff --git a/src/Symfony/Bundle/WebProfilerBundle/Controller/RouterController.php b/src/Symfony/Bundle/WebProfilerBundle/Controller/RouterController.php index f4a84bf568..2be420ba8b 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/Controller/RouterController.php +++ b/src/Symfony/Bundle/WebProfilerBundle/Controller/RouterController.php @@ -18,6 +18,7 @@ use Symfony\Component\Routing\RouteCollection; use Symfony\Component\Routing\RouterInterface; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Profiler\Profiler; +use Symfony\Component\HttpKernel\DataCollector\RequestDataCollector; /** * RouterController. @@ -62,16 +63,39 @@ class RouterController $profile = $this->profiler->loadProfile($token); - $context = $this->matcher->getContext(); - $context->setMethod($profile->getMethod()); - $matcher = new TraceableUrlMatcher($this->routes, $context); - + /** @var RequestDataCollector $request */ $request = $profile->getCollector('request'); return new Response($this->twig->render('@WebProfiler/Router/panel.html.twig', array( 'request' => $request, 'router' => $profile->getCollector('router'), - 'traces' => $matcher->getTraces($request->getPathInfo()), + 'traces' => $this->getTraces($request, $profile->getMethod()), )), 200, array('Content-Type' => 'text/html')); } + + /** + * Returns the routing traces associated to the given request. + * + * @param RequestDataCollector $request + * @param string $method + * + * @return array + */ + private function getTraces(RequestDataCollector $request, $method) + { + $traceRequest = Request::create( + $request->getPathInfo(), + $request->getRequestServer()->get('REQUEST_METHOD'), + $request->getRequestAttributes()->all(), + $request->getRequestCookies()->all(), + array(), + $request->getRequestServer()->all() + ); + + $context = $this->matcher->getContext(); + $context->setMethod($method); + $matcher = new TraceableUrlMatcher($this->routes, $context); + + return $matcher->getTracesForRequest($traceRequest); + } } diff --git a/src/Symfony/Component/Routing/Matcher/TraceableUrlMatcher.php b/src/Symfony/Component/Routing/Matcher/TraceableUrlMatcher.php index ef4f24c6c6..cb1a35f4d3 100644 --- a/src/Symfony/Component/Routing/Matcher/TraceableUrlMatcher.php +++ b/src/Symfony/Component/Routing/Matcher/TraceableUrlMatcher.php @@ -11,6 +11,7 @@ namespace Symfony\Component\Routing\Matcher; +use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Exception\ExceptionInterface; use Symfony\Component\Routing\Route; use Symfony\Component\Routing\RouteCollection; @@ -40,6 +41,15 @@ class TraceableUrlMatcher extends UrlMatcher return $this->traces; } + public function getTracesForRequest(Request $request) + { + $this->request = $request; + $traces = $this->getTraces($request->getPathInfo()); + $this->request = null; + + return $traces; + } + protected function matchCollection($pathinfo, RouteCollection $routes) { foreach ($routes as $name => $route) { diff --git a/src/Symfony/Component/Routing/Tests/Matcher/TraceableUrlMatcherTest.php b/src/Symfony/Component/Routing/Tests/Matcher/TraceableUrlMatcherTest.php index 20b30d7b91..e43cbcb6bd 100644 --- a/src/Symfony/Component/Routing/Tests/Matcher/TraceableUrlMatcherTest.php +++ b/src/Symfony/Component/Routing/Tests/Matcher/TraceableUrlMatcherTest.php @@ -11,6 +11,7 @@ namespace Symfony\Component\Routing\Tests\Matcher; +use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Route; use Symfony\Component\Routing\RouteCollection; use Symfony\Component\Routing\RequestContext; @@ -98,4 +99,23 @@ class TraceableUrlMatcherTest extends \PHPUnit_Framework_TestCase return $levels; } + + public function testRoutesWithConditions() + { + $routes = new RouteCollection(); + $routes->add('foo', new Route('/foo', array(), array(), array(), 'baz', array(), array(), "request.headers.get('User-Agent') matches '/firefox/i'")); + + $context = new RequestContext(); + $context->setHost('baz'); + + $matcher = new TraceableUrlMatcher($routes, $context); + + $notMatchingRequest = Request::create('/foo', 'GET'); + $traces = $matcher->getTracesForRequest($notMatchingRequest); + $this->assertEquals("Condition \"request.headers.get('User-Agent') matches '/firefox/i'\" does not evaluate to \"true\"", $traces[0]['log']); + + $matchingRequest = Request::create('/foo', 'GET', array(), array(), array(), array('HTTP_USER_AGENT' => 'Firefox')); + $traces = $matcher->getTracesForRequest($matchingRequest); + $this->assertEquals('Route matches!', $traces[0]['log']); + } }