Installation:
composer require symfony/debug
Laravel already includes this package via Symfony's components, so no additional config is needed.
First Use Case:
dump() or dd() in Tinker or controllers:
use Symfony\Component\VarDumper\VarDumper;
$user = User::find(1);
VarDumper::dump($user); // Dump without halting execution
VarDumper::dump($user, true); // Halt execution (like dd())
APP_DEBUG=true in .env for full stack traces and error details.Where to Look First:
dump()/dd() helpers (aliases for VarDumper).Debugging Requests/Responses:
// Log HTTP request data
dd(request()->all(), response()->headers->all());
Database Queries:
$query = User::where('active', true)->toSql();
dd($query, [$user->id]); // Show raw SQL + bindings
DB::enableQueryLog() for deeper SQL analysis.Tinker Integration:
php artisan tinker
dump()/dd() interactively to explore Eloquent models or service containers.Custom Dumpers:
Symfony\Component\VarDumper\Cloner\Data to handle custom objects:
class MyCloner extends \Symfony\Component\VarDumper\Cloner\Data
{
public function __clone()
{
// Custom logic for your class
}
}
VarDumper::setHandler(function ($var) {
return new \Symfony\Component\VarDumper\Dumper\HtmlDumper(new MyCloner());
});
Error Handling:
try-catch blocks with dd() for quick error inspection:
try {
$result = riskyOperation();
} catch (\Exception $e) {
dd($e, ['context' => 'operation']); // Inspect exception + metadata
}
barryvdh/laravel-debugbar for a UI-based debugger.dump() in logs via Log::debug(dump($var)) for structured debugging.assertEquals() with dd() in PHPUnit tests for ad-hoc debugging.Performance Overhead:
dd() halts execution; avoid in production or high-traffic routes.dump() for non-blocking debugging in live environments (if APP_DEBUG=true).Circular References:
VarDumper::setMaxItems() to limit depth:
VarDumper::setMaxItems(50); // Default is 100
Output Buffering:
file_put_contents('debug.log', dump($var));
Custom Objects:
__debugInfo():
class MyModel {
public function __debugInfo() {
return ['id' => $this->id, 'name' => $this->name];
}
}
Environment-Specific Debugging:
dd() in production via middleware:
if (!app()->environment('local')) {
abort_if(true, 403); // Bypass dd() in non-local envs
}
Color Output:
VarDumper::setHandler(new \Symfony\Component\VarDumper\Dumper\CliDumper());
HTML Dumping:
dd(view('emails.welcome')->render());
Debugging Exceptions:
App\Exceptions\Handler::render($request, $e) {
if ($request->wantsJson()) {
return response()->json(['error' => $e->getMessage(), 'trace' => $e->getTrace()]);
}
return parent::render($request, $e);
}
Debugging Queues:
dd() in handle() methods or inspect jobs via queue:work --once --verbose.Profiling:
$start = microtime(true);
// ... code ...
$duration = microtime(true) - $start;
dump("Duration: {$duration}s");
Configuration:
config/var_dumper.php (if manually configured):
'max_items' => 1000,
'max_depth' => 10,
How can I help you explore Laravel packages today?