symfony/var-dumper
Symfony VarDumper provides a smarter dump() for inspecting PHP variables, replacing var_dump() with rich, readable output. It can walk complex data structures, improving debugging in CLI and web contexts with configurable dumpers and casters.
Installation:
Add to composer.json:
composer require symfony/var-dumper
Or for Laravel (via Symfony’s HttpFoundation or standalone):
composer require symfony/var-dumper --dev
First Use Case:
Replace var_dump() or dd() with Symfony’s dump():
use Symfony\Component\VarDumper\VarDumper;
$user = User::find(1);
VarDumper::dump($user); // Colorized, structured output in CLI or HTML (if Accept header allows)
Where to Look First:
VarDumper::dump() and VarDumper::cliff() (compact mode).AbstractCloner::addDefaultCasters()) for custom objects.CLI Debugging: Use in Artisan commands, queues, or migrations:
// In a custom Artisan command
public function handle()
{
$data = $this->fetchData();
VarDumper::dump($data); // Terminal output with colors
}
Web Debugging:
Leverage Accept header for HTML/JSON output:
// In a controller
public function show(Request $request)
{
$data = ['user' => User::first()];
VarDumper::dump($data); // Auto-detects HTML/JSON based on Accept header
}
VarDumper::setHandler(function ($var) {
return new \Symfony\Component\VarDumper\Caster\HtmlDumper($var);
});
Testing:
Replace var_dump in tests:
public function testUserCreation()
{
$user = User::create([...]);
VarDumper::dump($user->toArray()); // Debug test data
$this->assertTrue(true);
}
Custom Casters: Extend for Laravel-specific objects (e.g., Eloquent models, Livewire components):
use Symfony\Component\VarDumper\Caster\Caster;
class EloquentModelCaster implements Caster
{
public function getType()
{
return 'eloquent_model';
}
public function castToString($value)
{
return sprintf('<info>%s</info> {#%d}', get_class($value), spl_object_id($value));
}
}
// Register globally
\Symfony\Component\VarDumper\Cloner\AbstractCloner::addDefaultCasters(new EloquentModelCaster());
Environment Control:
Disable in production via .env:
if (!app()->environment('production')) {
VarDumper::dump($sensitiveData); // Safe for staging/QA
}
Laravel Service Provider:
Bind VarDumper globally for easy access:
// app/Providers/AppServiceProvider.php
public function boot()
{
if ($this->app->environment('local')) {
$this->app->singleton('var_dumper', function () {
return new \Symfony\Component\VarDumper\VarDumper();
});
}
}
Usage:
app('var_dumper')->dump($data);
Middleware for Debug Routes:
Restrict dump() to admin routes:
// app/Http/Middleware/DebugMiddleware.php
public function handle($request, Closure $next)
{
if ($request->user()->isAdmin() && $request->has('debug')) {
VarDumper::dump($request->all());
}
return $next($request);
}
Queue Job Debugging: Log dumps to a file or database:
// In a queue job
public function handle()
{
$data = $this->process();
file_put_contents(storage_path('logs/debug_dump.log'), VarDumper::export($data), FILE_APPEND);
}
Sensitive Data Leaks:
VarDumper::setMaxItems() or custom casters to mask sensitive fields:
VarDumper::setMaxItems(10); // Limit nested depth
Or override casters for Illuminate\Support\Collection:
class SecureCollectionCaster implements Caster
{
public function castToString($value)
{
$data = $value->toArray();
unset($data['password'], $data['api_token']);
return VarDumper::export($data);
}
}
Performance Overhead:
dump() can slow down CLI commands or queues.cliff() for compact output:
VarDumper::cliff($data); // Faster, less verbose
HTML Output Quirks:
header('Content-Type: application/json');
echo VarDumper::export($data);
Circular References:
belongsToMany).$cloner = new \Symfony\Component\VarDumper\Cloner\VarCloner();
$cloner->setMaxItems(50); // Prevent stack overflow
VarDumper::setCloner($cloner);
CLI Color Conflicts:
cliff() or force ANSI escape codes:
putenv('TERM=xterm-256color'); // Ensure color support
Inspect Casters: List registered casters to debug why an object isn’t dumping correctly:
$cloner = new \Symfony\Component\VarDumper\Cloner\VarCloner();
print_r($cloner->getCasters());
Export to File: For complex data, export to a file for later inspection:
file_put_contents(
storage_path('logs/debug_dump.txt'),
VarDumper::export($data, VarDumper::EXPORT_RAW)
);
Override Default Handlers: Customize output format globally:
VarDumper::setHandler(function ($var) {
return new \Symfony\Component\VarDumper\Caster\JsonCaster($var);
});
Custom Dumper Classes:
Extend \Symfony\Component\VarDumper\Dumper\AbstractDumper for custom output (e.g., Markdown, CSV):
class MarkdownDumper extends AbstractDumper
{
protected function dumpScalar($value, $label = null)
{
return "**$label**: $value\n";
}
}
Dynamic Caster Registration: Load casters dynamically based on environment:
if (app()->environment('local')) {
\Symfony\Component\VarDumper\Cloner\AbstractCloner::addDefaultCasters(
new EloquentModelCaster(),
new LivewireComponentCaster()
);
}
Integrate with Laravel Debugbar: Use VarDumper as a backend for Laravel Debugbar:
// In a Debugbar collector
public function collect()
{
$this->data['var_dump'] = VarDumper::export($this->getData());
}
Support for Proprietary Objects: Add casters for packages like Filament, Nova, or Livewire:
class FilamentResourceCaster implements Caster
{
public function getType()
{
return 'filament_resource';
}
public function castToString($value)
{
return sprintf(
'<options=bold>%s</> Resource {#%d}',
$value->getLabel(),
spl_object_id($value)
);
}
}
Accept Header Handling:
VarDumHow can I help you explore Laravel packages today?