diff --git a/src/Symfony/Bundle/DebugBundle/DependencyInjection/DebugExtension.php b/src/Symfony/Bundle/DebugBundle/DependencyInjection/DebugExtension.php index aa124a8c03b26..317f2fba4e093 100644 --- a/src/Symfony/Bundle/DebugBundle/DependencyInjection/DebugExtension.php +++ b/src/Symfony/Bundle/DebugBundle/DependencyInjection/DebugExtension.php @@ -17,6 +17,7 @@ use Symfony\Component\DependencyInjection\Extension\Extension; use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; use Symfony\Component\DependencyInjection\Reference; +use Symfony\Component\VarDumper\Dumper\CliDumper; /** * DebugExtension. @@ -69,6 +70,14 @@ public function load(array $configs, ContainerBuilder $container) ->setClass(ServerDumpPlaceholderCommand::class) ; } + + if (method_exists(CliDumper::class, 'setDisplayOptions')) { + $container->getDefinition('var_dumper.cli_dumper') + ->addMethodCall('setDisplayOptions', array(array( + 'fileLinkFormat' => new Reference('debug.file_link_formatter', ContainerBuilder::IGNORE_ON_INVALID_REFERENCE), + ))) + ; + } } /** diff --git a/src/Symfony/Component/HttpKernel/DataCollector/DumpDataCollector.php b/src/Symfony/Component/HttpKernel/DataCollector/DumpDataCollector.php index 13694f5a5937f..051c3dd2cfb0d 100644 --- a/src/Symfony/Component/HttpKernel/DataCollector/DumpDataCollector.php +++ b/src/Symfony/Component/HttpKernel/DataCollector/DumpDataCollector.php @@ -113,6 +113,9 @@ public function collect(Request $request, Response $response, \Exception $except $dumper->setDisplayOptions(array('fileLinkFormat' => $this->fileLinkFormat)); } else { $dumper = new CliDumper('php://output', $this->charset); + if (method_exists($dumper, 'setDisplayOptions')) { + $dumper->setDisplayOptions(array('fileLinkFormat' => $this->fileLinkFormat)); + } } foreach ($this->data as $dump) { @@ -215,6 +218,9 @@ public function __destruct() $dumper->setDisplayOptions(array('fileLinkFormat' => $this->fileLinkFormat)); } else { $dumper = new CliDumper('php://output', $this->charset); + if (method_exists($dumper, 'setDisplayOptions')) { + $dumper->setDisplayOptions(array('fileLinkFormat' => $this->fileLinkFormat)); + } } foreach ($this->data as $i => $dump) { diff --git a/src/Symfony/Component/VarDumper/Dumper/CliDumper.php b/src/Symfony/Component/VarDumper/Dumper/CliDumper.php index 9fcd6c412666f..a6341709a48fa 100644 --- a/src/Symfony/Component/VarDumper/Dumper/CliDumper.php +++ b/src/Symfony/Component/VarDumper/Dumper/CliDumper.php @@ -55,6 +55,10 @@ class CliDumper extends AbstractDumper protected $collapseNextHash = false; protected $expandNextHash = false; + private $displayOptions = array( + 'fileLinkFormat' => null, + ); + /** * {@inheritdoc} */ @@ -76,6 +80,8 @@ public function __construct($output = null, string $charset = null, int $flags = 'index' => '34', )); } + + $this->displayOptions['fileLinkFormat'] = ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format') ?: 'file://%f'; } /** @@ -108,6 +114,16 @@ public function setStyles(array $styles) $this->styles = $styles + $this->styles; } + /** + * Configures display options. + * + * @param array $displayOptions A map of display options to customize the behavior + */ + public function setDisplayOptions(array $displayOptions) + { + $this->displayOptions = $displayOptions + $this->displayOptions; + } + /** * {@inheritdoc} */ @@ -427,7 +443,9 @@ protected function style($style, $value, $attr = array()) $value = substr($value, -$attr['ellipsis']); } - return $this->style('default', $prefix).$this->style($style, $value); + $value = $this->style('default', $prefix).$this->style($style, $value); + + goto href; } $style = $this->styles[$style]; @@ -458,6 +476,16 @@ protected function style($style, $value, $attr = array()) } } + href: + if ($this->colors) { + if (isset($attr['file']) && $href = $this->getSourceLink($attr['file'], isset($attr['line']) ? $attr['line'] : 0)) { + $attr['href'] = $href; + } + if (isset($attr['href'])) { + $value = "\033]8;;{$attr['href']}\033\\{$value}\033]8;;\033\\"; + } + } + return $value; } @@ -594,4 +622,13 @@ private function isWindowsTrueColor() return $result; } + + private function getSourceLink($file, $line) + { + if ($fmt = $this->displayOptions['fileLinkFormat']) { + return \is_string($fmt) ? strtr($fmt, array('%f' => $file, '%l' => $line)) : $fmt->format($file, $line); + } + + return false; + } }