diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/RouterDebugCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/RouterDebugCommand.php index ec8d53b06ca8..bad3fa0598a5 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/RouterDebugCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/RouterDebugCommand.php @@ -19,6 +19,7 @@ use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\HttpKernel\Debug\FileLinkFormatter; use Symfony\Component\Routing\RouteCollection; use Symfony\Component\Routing\RouterInterface; @@ -34,12 +35,14 @@ class RouterDebugCommand extends Command { protected static $defaultName = 'debug:router'; private $router; + private $fileLinkFormatter; - public function __construct(RouterInterface $router) + public function __construct(RouterInterface $router, FileLinkFormatter $fileLinkFormatter = null) { parent::__construct(); $this->router = $router; + $this->fileLinkFormatter = $fileLinkFormatter; } /** @@ -74,7 +77,7 @@ protected function execute(InputInterface $input, OutputInterface $output) { $io = new SymfonyStyle($input, $output); $name = $input->getArgument('name'); - $helper = new DescriptorHelper(); + $helper = new DescriptorHelper($this->fileLinkFormatter); $routes = $this->router->getRouteCollection(); if ($name) { diff --git a/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/TextDescriptor.php b/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/TextDescriptor.php index 186191689616..a69dbfd3d21d 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/TextDescriptor.php +++ b/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/TextDescriptor.php @@ -24,6 +24,7 @@ use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag; use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use Symfony\Component\HttpKernel\Debug\FileLinkFormatter; use Symfony\Component\Routing\Route; use Symfony\Component\Routing\RouteCollection; @@ -34,6 +35,13 @@ */ class TextDescriptor extends Descriptor { + private $fileLinkFormatter; + + public function __construct(FileLinkFormatter $fileLinkFormatter = null) + { + $this->fileLinkFormatter = $fileLinkFormatter; + } + /** * {@inheritdoc} */ @@ -48,17 +56,18 @@ protected function describeRouteCollection(RouteCollection $routes, array $optio $tableRows = []; foreach ($routes->all() as $name => $route) { + $controller = $route->getDefault('_controller'); + $row = [ $name, $route->getMethods() ? implode('|', $route->getMethods()) : 'ANY', $route->getSchemes() ? implode('|', $route->getSchemes()) : 'ANY', '' !== $route->getHost() ? $route->getHost() : 'ANY', - $route->getPath(), + $this->formatControllerLink($controller, $route->getPath()), ]; if ($showControllers) { - $controller = $route->getDefault('_controller'); - $row[] = $controller ? $this->formatCallable($controller) : ''; + $row[] = $controller ? $this->formatControllerLink($controller, $this->formatCallable($controller)) : ''; } $tableRows[] = $row; @@ -514,6 +523,35 @@ private function formatRouterConfig(array $config): string return trim($configAsString); } + private function formatControllerLink($controller, string $anchorText): string + { + if (null === $this->fileLinkFormatter) { + return $anchorText; + } + + try { + if (\is_array($controller)) { + $r = new \ReflectionMethod($controller); + } elseif ($controller instanceof \Closure) { + $r = new \ReflectionFunction($controller); + } elseif (method_exists($controller, '__invoke')) { + $r = new \ReflectionMethod($controller, '__invoke'); + } elseif (!\is_string($controller)) { + return $anchorText; + } elseif (false !== strpos($controller, '::')) { + $r = new \ReflectionMethod($controller); + } else { + $r = new \ReflectionFunction($controller); + } + } catch (\ReflectionException $e) { + return $anchorText; + } + + $fileLink = $this->fileLinkFormatter->format($r->getFileName(), $r->getStartLine()); + + return sprintf('%s', $fileLink, $anchorText); + } + private function formatCallable($callable): string { if (\is_array($callable)) { diff --git a/src/Symfony/Bundle/FrameworkBundle/Console/Helper/DescriptorHelper.php b/src/Symfony/Bundle/FrameworkBundle/Console/Helper/DescriptorHelper.php index 475c22ca31e8..1f17c999424d 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Console/Helper/DescriptorHelper.php +++ b/src/Symfony/Bundle/FrameworkBundle/Console/Helper/DescriptorHelper.php @@ -16,6 +16,7 @@ use Symfony\Bundle\FrameworkBundle\Console\Descriptor\TextDescriptor; use Symfony\Bundle\FrameworkBundle\Console\Descriptor\XmlDescriptor; use Symfony\Component\Console\Helper\DescriptorHelper as BaseDescriptorHelper; +use Symfony\Component\HttpKernel\Debug\FileLinkFormatter; /** * @author Jean-François Simon @@ -24,10 +25,10 @@ */ class DescriptorHelper extends BaseDescriptorHelper { - public function __construct() + public function __construct(FileLinkFormatter $fileLinkFormatter = null) { $this - ->register('txt', new TextDescriptor()) + ->register('txt', new TextDescriptor($fileLinkFormatter)) ->register('xml', new XmlDescriptor()) ->register('json', new JsonDescriptor()) ->register('md', new MarkdownDescriptor()) diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/console.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/console.xml index 050144e5a8b2..7b79664c1f8f 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/console.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/console.xml @@ -111,6 +111,7 @@ +