11
11
12
12
namespace Symfony \Component \VarDumper ;
13
13
14
+ use Symfony \Component \HttpFoundation \Request ;
15
+ use Symfony \Component \HttpFoundation \RequestStack ;
16
+ use Symfony \Component \HttpKernel \Debug \FileLinkFormatter ;
14
17
use Symfony \Component \VarDumper \Caster \ReflectionCaster ;
15
18
use Symfony \Component \VarDumper \Cloner \VarCloner ;
16
19
use Symfony \Component \VarDumper \Dumper \CliDumper ;
20
+ use Symfony \Component \VarDumper \Dumper \ContextProvider \CliContextProvider ;
21
+ use Symfony \Component \VarDumper \Dumper \ContextProvider \RequestContextProvider ;
17
22
use Symfony \Component \VarDumper \Dumper \ContextProvider \SourceContextProvider ;
18
23
use Symfony \Component \VarDumper \Dumper \ContextualizedDumper ;
19
24
use Symfony \Component \VarDumper \Dumper \HtmlDumper ;
25
+ use Symfony \Component \VarDumper \Dumper \ServerDumper ;
20
26
21
27
// Load the global dump() function
22
28
require_once __DIR__ .'/Resources/functions/dump.php ' ;
@@ -31,20 +37,7 @@ class VarDumper
31
37
public static function dump ($ var )
32
38
{
33
39
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 ();
48
41
}
49
42
50
43
return (self ::$ handler )($ var );
@@ -53,8 +46,64 @@ public static function dump($var)
53
46
public static function setHandler (callable $ callable = null )
54
47
{
55
48
$ 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
+
56
55
self ::$ handler = $ callable ;
57
56
58
57
return $ prevHandler ;
59
58
}
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
+ }
60
109
}
0 commit comments