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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy