Improve error reporting in router panel of web profiler
This commit is contained in:
parent
ae0b5fa382
commit
10015546b0
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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']);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user