Skip to content

Commit f148793

Browse files
[VarDumper] Add support of named arguments to dd() and dump() to display a "section name"
1 parent 13059f6 commit f148793

File tree

6 files changed

+62
-15
lines changed

6 files changed

+62
-15
lines changed

src/Symfony/Component/VarDumper/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
CHANGELOG
22
=========
33

4+
6.3
5+
---
6+
7+
* Add support of named arguments to `dd()` and `dump()` to display a "section name"
8+
49
6.2
510
---
611

src/Symfony/Component/VarDumper/Cloner/Data.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,11 @@ public function withContext(array $context): static
211211
return $data;
212212
}
213213

214+
public function getContext(): array
215+
{
216+
return $this->context;
217+
}
218+
214219
/**
215220
* Seeks to a specific key in nested data structures.
216221
*/
@@ -266,6 +271,11 @@ public function dump(DumperInterface $dumper)
266271
if ($cursor->attr = $this->context[SourceContextProvider::class] ?? []) {
267272
$cursor->attr['if_links'] = true;
268273
$cursor->hashType = -1;
274+
275+
if (null !== ($sectionName = $this->context['section_name'] ?? null)) {
276+
$dumper->dumpScalar($cursor, 'default', $sectionName);
277+
}
278+
269279
$dumper->dumpScalar($cursor, 'default', '^');
270280
$cursor->attr = ['if_links' => true];
271281
$dumper->dumpScalar($cursor, 'default', ' ');

src/Symfony/Component/VarDumper/Dumper/ContextualizedDumper.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public function __construct(DataDumperInterface $wrappedDumper, array $contextPr
3333

3434
public function dump(Data $data)
3535
{
36-
$context = [];
36+
$context = $data->getContext();
3737
foreach ($this->contextProviders as $contextProvider) {
3838
$context[$contextProvider::class] = $contextProvider->getContext();
3939
}

src/Symfony/Component/VarDumper/Resources/functions/dump.php

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,19 @@
1414
if (!function_exists('dump')) {
1515
/**
1616
* @author Nicolas Grekas <p@tchwork.com>
17+
* @author Alexandre Daubois <alex.daubois@gmail.com>
1718
*/
18-
function dump(mixed $var, mixed ...$moreVars): mixed
19+
function dump(mixed ...$vars): mixed
1920
{
20-
VarDumper::dump($var);
21-
22-
foreach ($moreVars as $v) {
23-
VarDumper::dump($v);
21+
foreach ($vars as $key => $v) {
22+
VarDumper::dump($v, is_numeric($key) ? null : $key);
2423
}
2524

26-
if (1 < func_num_args()) {
27-
return func_get_args();
25+
if (1 < count($vars)) {
26+
return $vars;
2827
}
2928

30-
return $var;
29+
return reset($vars);
3130
}
3231
}
3332

@@ -41,8 +40,8 @@ function dd(...$vars): void
4140
header('HTTP/1.1 500 Internal Server Error');
4241
}
4342

44-
foreach ($vars as $v) {
45-
VarDumper::dump($v);
43+
foreach ($vars as $key => $v) {
44+
VarDumper::dump($v, is_numeric($key) ? null : $key);
4645
}
4746

4847
exit(1);

src/Symfony/Component/VarDumper/Tests/Dumper/FunctionsTest.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,19 @@ public function testDumpReturnsFirstArg()
3131
$this->assertEquals($var1, $return);
3232
}
3333

34+
public function testDumpReturnsFirstNamedArgWithoutSectionName()
35+
{
36+
$this->setupVarDumper();
37+
38+
$var1 = 'a';
39+
40+
ob_start();
41+
$return = dump(first: $var1);
42+
ob_end_clean();
43+
44+
$this->assertEquals($var1, $return);
45+
}
46+
3447
public function testDumpReturnsAllArgsInArray()
3548
{
3649
$this->setupVarDumper();
@@ -46,6 +59,21 @@ public function testDumpReturnsAllArgsInArray()
4659
$this->assertEquals([$var1, $var2, $var3], $return);
4760
}
4861

62+
public function testDumpReturnsAllNamedArgsInArray()
63+
{
64+
$this->setupVarDumper();
65+
66+
$var1 = 'a';
67+
$var2 = 'b';
68+
$var3 = 'c';
69+
70+
ob_start();
71+
$return = dump($var1, second: $var2, third: $var3);
72+
ob_end_clean();
73+
74+
$this->assertEquals([$var1, 'second' => $var2, 'third' => $var3], $return);
75+
}
76+
4977
protected function setupVarDumper()
5078
{
5179
$cloner = new VarCloner();

src/Symfony/Component/VarDumper/VarDumper.php

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@ class VarDumper
3737
*/
3838
private static $handler;
3939

40-
public static function dump(mixed $var)
40+
public static function dump(mixed $var, string $sectionName = null)
4141
{
4242
if (null === self::$handler) {
4343
self::register();
4444
}
4545

46-
return (self::$handler)($var);
46+
return (self::$handler)($var, $sectionName);
4747
}
4848

4949
public static function setHandler(callable $callable = null): ?callable
@@ -90,8 +90,13 @@ private static function register(): void
9090
$dumper = new ContextualizedDumper($dumper, [new SourceContextProvider()]);
9191
}
9292

93-
self::$handler = function ($var) use ($cloner, $dumper) {
94-
$dumper->dump($cloner->cloneVar($var));
93+
self::$handler = function ($var, string $sectionName = null) use ($cloner, $dumper) {
94+
$dumper->dump(
95+
$cloner->cloneVar($var)
96+
->withContext([
97+
'section_name' => $sectionName,
98+
])
99+
);
95100
};
96101
}
97102

0 commit comments

Comments
 (0)