Skip to content

Commit 82df6db

Browse files
ogizanagifabpot
authored andcommitted
[VarDumper] Add VAR_DUMPER_FORMAT=server format
1 parent 9b197fe commit 82df6db

File tree

2 files changed

+69
-14
lines changed

2 files changed

+69
-14
lines changed

src/Symfony/Component/VarDumper/CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
CHANGELOG
22
=========
33

4+
5.2.0
5+
-----
6+
7+
* added `VAR_DUMPER_FORMAT=server` env var value support
8+
* prevent replacing the handler when the `VAR_DUMPER_FORMAT` env var is set
9+
410
5.1.0
511
-----
612

src/Symfony/Component/VarDumper/VarDumper.php

+63-14
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,18 @@
1111

1212
namespace Symfony\Component\VarDumper;
1313

14+
use Symfony\Component\HttpFoundation\Request;
15+
use Symfony\Component\HttpFoundation\RequestStack;
16+
use Symfony\Component\HttpKernel\Debug\FileLinkFormatter;
1417
use Symfony\Component\VarDumper\Caster\ReflectionCaster;
1518
use Symfony\Component\VarDumper\Cloner\VarCloner;
1619
use Symfony\Component\VarDumper\Dumper\CliDumper;
20+
use Symfony\Component\VarDumper\Dumper\ContextProvider\CliContextProvider;
21+
use Symfony\Component\VarDumper\Dumper\ContextProvider\RequestContextProvider;
1722
use Symfony\Component\VarDumper\Dumper\ContextProvider\SourceContextProvider;
1823
use Symfony\Component\VarDumper\Dumper\ContextualizedDumper;
1924
use Symfony\Component\VarDumper\Dumper\HtmlDumper;
25+
use Symfony\Component\VarDumper\Dumper\ServerDumper;
2026

2127
// Load the global dump() function
2228
require_once __DIR__.'/Resources/functions/dump.php';
@@ -31,20 +37,7 @@ class VarDumper
3137
public static function dump($var)
3238
{
3339
if (null === self::$handler) {
34-
$cloner = new VarCloner();
35-
$cloner->addCasters(ReflectionCaster::UNSET_CLOSURE_FILE_INFO);
36-
37-
if (isset($_SERVER['VAR_DUMPER_FORMAT'])) {
38-
$dumper = 'html' === $_SERVER['VAR_DUMPER_FORMAT'] ? new HtmlDumper() : new CliDumper();
39-
} else {
40-
$dumper = \in_array(\PHP_SAPI, ['cli', 'phpdbg']) ? new CliDumper() : new HtmlDumper();
41-
}
42-
43-
$dumper = new ContextualizedDumper($dumper, [new SourceContextProvider()]);
44-
45-
self::$handler = function ($var) use ($cloner, $dumper) {
46-
$dumper->dump($cloner->cloneVar($var));
47-
};
40+
self::register();
4841
}
4942

5043
return (self::$handler)($var);
@@ -53,8 +46,64 @@ public static function dump($var)
5346
public static function setHandler(callable $callable = null)
5447
{
5548
$prevHandler = self::$handler;
49+
50+
// Prevent replacing the handler with expected format as soon as the env var was set:
51+
if (isset($_SERVER['VAR_DUMPER_FORMAT'])) {
52+
return $prevHandler;
53+
}
54+
5655
self::$handler = $callable;
5756

5857
return $prevHandler;
5958
}
59+
60+
private static function register(): void
61+
{
62+
$cloner = new VarCloner();
63+
$cloner->addCasters(ReflectionCaster::UNSET_CLOSURE_FILE_INFO);
64+
65+
$format = $_SERVER['VAR_DUMPER_FORMAT'] ?? null;
66+
switch (true) {
67+
case 'html' === $format:
68+
$dumper = new HtmlDumper();
69+
break;
70+
case 'cli' === $format:
71+
$dumper = new CliDumper();
72+
break;
73+
case 'server' === $format:
74+
case 'tcp' === parse_url($format, PHP_URL_SCHEME):
75+
$host = 'server' === $format ? $_SERVER['VAR_DUMPER_SERVER'] ?? '127.0.0.1:9912' : $format;
76+
$dumper = \in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) ? new CliDumper() : new HtmlDumper();
77+
$dumper = new ServerDumper($host, $dumper, self::getDefaultContextProviders());
78+
break;
79+
default:
80+
$dumper = \in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) ? new CliDumper() : new HtmlDumper();
81+
}
82+
83+
if (!$dumper instanceof ServerDumper) {
84+
$dumper = new ContextualizedDumper($dumper, [new SourceContextProvider()]);
85+
}
86+
87+
self::$handler = function ($var) use ($cloner, $dumper) {
88+
$dumper->dump($cloner->cloneVar($var));
89+
};
90+
}
91+
92+
private static function getDefaultContextProviders(): array
93+
{
94+
$contextProviders = [];
95+
96+
if (!\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) && (class_exists(Request::class))) {
97+
$requestStack = new RequestStack();
98+
$requestStack->push(Request::createFromGlobals());
99+
$contextProviders['request'] = new RequestContextProvider($requestStack);
100+
}
101+
102+
$fileLinkFormatter = class_exists(FileLinkFormatter::class) ? new FileLinkFormatter(null, $requestStack ?? null) : null;
103+
104+
return $contextProviders + [
105+
'cli' => new CliContextProvider(),
106+
'source' => new SourceContextProvider(null, null, $fileLinkFormatter),
107+
];
108+
}
60109
}

0 commit comments

Comments
 (0)