symfony/var-dumper
Symfony VarDumper provides a powerful dump() replacement for var_dump(), with smart variable inspection and rich output for debugging PHP applications. Walks complex data structures safely, improving readability and developer productivity.
Installation:
composer require symfony/var-dumper
For Laravel projects, this is often included as a dependency of other Symfony components (e.g., symfony/debug-bundle or symfony/framework-bundle).
First Use:
Replace var_dump() or dd() with Symfony’s dump():
use Symfony\Component\VarDumper\VarDumper;
$user = User::find(1);
VarDumper::dump($user); // Outputs formatted, colorized data to CLI or HTML
Where to Look First:
VarDumper (main facade for dump() and cliff() methods).Cloner\AbstractCloner (for custom casters).Dumper\DumperInterface (for output formatting).vendor/symfony/var-dumper for standalone usage or leverage dd() (which uses VarDumper under the hood).use Symfony\Component\VarDumper\VarDumper;
// In a controller or service
$user = User::with('posts.comments')->find(1);
VarDumper::dump($user); // Shows nested relationships with collapsible sections
Why?
var_dump($user) with a readable, interactive output.=> for object references).var_dump() and dd()VarDumper::dump($this->getSomeData()); // Colorized terminal output
VarDumper::dump($request->all()); // Renders as collapsible HTML
dd() (which internally uses VarDumper):
dd($user->posts); // Automatically dumps and dies
VarDumper::setHandler(function ($var) {
echo VarDumper::dump($var, true); // `true` for CLI format
});
VarDumper::setColors(false);
use Symfony\Component\VarDumper\VarDumper;
public function handle($request, Closure $next)
{
$response = $next($request);
if ($request->query('debug')) {
VarDumper::dump($response->getContent());
}
return $response;
}
public function handle(JobProcessed $event)
{
if (app()->environment('local')) {
VarDumper::dump($event->job->payload());
}
}
use Symfony\Component\VarDumper\VarDumper;
it('validates user creation', function () {
$user = User::factory()->create();
VarDumper::dump($user->toArray()); // Debug test data
expect($user->email)->toBe('test@example.com');
});
public function testSomething()
{
$result = $this->service->process();
VarDumper::dump($result); // Debug test output
$this->assertTrue($result);
}
use Symfony\Component\VarDumper\VarDumper;
protected function handle()
{
$data = $this->getDataFromSomewhere();
VarDumper::dump($data); // Colorized CLI output
}
public function handle()
{
$payload = $this->job->payload();
if (app()->environment('local')) {
VarDumper::dump($payload);
}
// Process job...
}
Override dd() Globally:
Add to AppServiceProvider:
use Symfony\Component\VarDumper\VarDumper;
public function boot()
{
if ($this->app->environment('local')) {
\Illuminate\Support\Facades\Facade::clearResolvedInstance('dump');
\Illuminate\Support\Facades\Facade::setFacadeApplication($this->app);
}
}
Now dd() uses VarDumper’s enhanced output.
Custom Debug Routes:
Route::get('/debug', function () {
if (auth()->check() && auth()->user()->isAdmin()) {
VarDumper::dump(request()->all());
}
return response('Debug data shown in CLI/HTML');
})->name('debug.data');
Queue Job Debugging:
Use App\Jobs\DebugJob:
public function handle()
{
if (app()->environment('local')) {
VarDumper::dump($this->data);
}
// Process job...
}
Add Custom Casters (for Eloquent, Livewire, etc.):
use Symfony\Component\VarDumper\Cloner\AbstractCloner;
AbstractCloner::addDefaultCasters(function (AbstractCloner $cloner) {
$cloner->addCaster('App\Models\User', function ($user) {
return [
'id' => $user->id,
'name' => $user->name,
'email' => $user->email,
'posts_count' => $user->posts()->count(),
];
});
});
Handle Sensitive Data:
AbstractCloner::addDefaultCasters(function (AbstractCloner $cloner) {
$cloner->addCaster('stdClass', function ($data) {
if (isset($data->password)) {
$data->password = '[FILTERED]';
}
return $data;
});
});
Output Buffering Issues:
ob_start() or flush():
ob_start();
VarDumper::dump($data);
echo ob_get_clean();
HTML vs. CLI Detection:
Accept: */*).VarDumper::dump($data, true); // Force CLI format
// or
VarDumper::dump($data, false, true); // Force HTML format
Performance in Loops:
VarDumper::dump() in tight loops (e.g., migrations) can slow execution.if (!app()->runningInConsole() && !app()->environment('local')) {
return;
}
VarDumper::dump($data);
Circular References:
VarDumper::setMaxItems():
VarDumper::setMaxItems(100); // Limit output size
Sensitive Data Leaks:
VarDumper::dump(request()->headers->all());
VarDumper::dump(request()->query());
VarDumper::dump(request()->input());
How can I help you explore Laravel packages today?