Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit ab3b0c9

Browse files
committed
feature #35967 [VarDumper] Add VAR_DUMPER_FORMAT=server format (ogizanagi)
This PR was squashed before being merged into the 5.2-dev branch. Discussion ---------- [VarDumper] Add VAR_DUMPER_FORMAT=server format | Q | A | ------------- | --- | Branch? | master<!-- see below --> | Bug fix? | no | New feature? | yes<!-- please update src/**/CHANGELOG.md files --> | Deprecations? | no <!-- please update UPGRADE-*.md and src/**/CHANGELOG.md files --> | Tickets | Fix #35801 <!-- prefix each issue number with "Fix #", if any --> | License | MIT | Doc PR | TODO <!-- required for new features --> This PR follows discussion in #35801 and adds support for a `server` value for the existing `VAR_DUMPER_FORMAT` env var. It comes as well with two more things: - ~~the handler is registered as soon as the `VAR_DUMPER_FORMAT` env var is detected~~ we prevent registering another handler as soon as the `VAR_DUMPER_FORMAT` env var is set, instead of checking if there was a previous handler (which could make this env var useless in some conditions where the handler was already set by another "process") - the handler registered this way cannot be replaced. This prevents another "process" to takeover dump handling while undesired. E.g: a phpunit functional test booting the kernel to call an endpoint => the handler is replaced. It's (in a sense) a satisfying alternative to #26696 This PR means anyone can use dump with a server in any context, without changing a single line of code in the project by: - starting the server using `./vendor/bin/var-dump-server --format=html > dumps.html` - using the env var: `VAR_DUMPER_FORMAT=server [your-cli-command]` --- Previous related PRs: - #26695 - #26696 Commits ------- 82df6db [VarDumper] Add VAR_DUMPER_FORMAT=server format
2 parents f3962d4 + 82df6db commit ab3b0c9

File tree

2 files changed

+69
-14
lines changed

2 files changed

+69
-14
lines changed

src/Symfony/Component/VarDumper/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
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

Lines changed: 63 additions & 14 deletions
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)