Improve error reporting in router panel of web profiler

This commit is contained in:
Javier Eguiluz 2016-02-09 21:40:11 +01:00 committed by Fabien Potencier
parent ae0b5fa382
commit 10015546b0
3 changed files with 59 additions and 5 deletions

View File

@ -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);
}
}

View File

@ -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) {

View File

@ -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']);
}
}