symfony/debug-bundle
Symfony DebugBundle integrates the VarDumper component and MonologBridge’s ServerLogCommand into the full-stack framework, enhancing debugging and server-side logging during development with tight Symfony tooling support.
Installation: Add the package via Composer in a Laravel project (if using Symfony components):
composer require symfony/debug-bundle
For Laravel, manually register the bundle in config/app.php under extra.bundles (if using Symfony’s HttpKernel):
'bundles' => [
// ...
Symfony\Bundle\DebugBundle\DebugBundle::class => ['all' => true],
],
First Use Case:
/_profiler or /_error in development to see the Symfony Profiler toolbar.php bin/console debug:container to inspect service containers.dump() or dd() (via symfony/var-dumper) in controllers or commands for rich variable inspection.Where to Look First:
/_profiler for request/response data, exceptions, and SQL queries.debug:container, debug:router, debug:event-dispatcher.config/packages/dev/debug.yaml (Symfony) or config/debug.php (Laravel) to toggle features.Debugging HTTP Requests:
routes/web.php:
Route::get('/debug', [\Symfony\Bundle\DebugBundle\Controller\ProfilerController::class, 'profiler']);
CLI Debugging:
php artisan debug:container --show-private
php artisan debug:router
php artisan debug:event-dispatcher
VarDumper Integration:
var_dump() with dump() or dd() (via symfony/var-dumper):
use Symfony\Component\VarDumper\VarDumper;
VarDumper::dump($user); // Pretty-printed output
VarDumper\Dumper\AbstractDumper for domain-specific objects.Monolog Integration:
ServerLogCommand:
php artisan debug:server-log
config/packages/monolog.yaml:
handlers:
main:
level: debug
Environment-Specific Debugging:
.env:
APP_DEBUG=true
SYMFONY_DEBUG_TOOLBAR=true
config('debug') to conditionally load the bundle.Laravel-Symfony Hybrid Apps:
Symfony\Component\HttpKernel\HttpKernelInterface for Symfony components while keeping Laravel’s routing.Kernel in Symfony’s HttpKernel:
use Symfony\Component\HttpKernel\Kernel as SymfonyKernel;
class AppKernel extends SymfonyKernel {
public function __construct($environment, $debug) {
parent::__construct($environment, $debug);
$this->registerBundles();
}
}
Custom Data Collectors:
Symfony\Component\HttpKernel\DataCollector\DataCollector to add app-specific metrics (e.g., cache hits, queue jobs).class CacheCollector extends DataCollector {
public function collect(Request $request, \Symfony\Component\HttpKernel\HttpKernelInterface $kernel, Request $masterRequest) {
$this->data['cache_hits'] = Cache::stats()['hits'];
}
}
Debugging Queues/Jobs:
symfony/messenger and enable debug mode:
# config/packages/messenger.yaml
messenger:
transports:
async: { dsn: '%env(MESSENGER_TRANSPORT_DSN)%', options: { debug: true } }
Performance Overhead:
if (!$this->container->getParameter('kernel.debug')) {
return;
}
Toolbar in Production:
/_profiler or /_error in production can leak sensitive data.config/packages/debug.yaml:
framework:
router:
debug: '%kernel.debug%'
Route::middleware(['web', 'debug'])->group(function () {
// Debug routes only
});
CLI Command Conflicts:
artisan commands (e.g., debug:container vs. laravel-debugbar).artisan:
// In AppServiceProvider@boot()
$this->app['artisan']->extend(function ($artisan) {
$artisan->add(new \Symfony\Bundle\DebugBundle\Command\DebugCommand());
});
VarDumper in Production:
dd() or dump() calls can halt execution unexpectedly.if (app()->environment('local')) {
dd($variable);
}
Monolog Configuration:
config/packages/monolog.yaml:
handlers:
main:
level: '%env(APP_LOG_LEVEL)%' # e.g., 'debug' in dev, 'info' in prod
Toolbar Not Showing:
kernel.debug is false or session not started.APP_DEBUG=true in .env.session.start() is called in middleware (Symfony) or StartSession middleware (Laravel).Data Collectors Not Loading:
AppKernel (Symfony) or Kernel (Laravel):
protected function registerContainerConfiguration(LoaderInterface $loader) {
$loader->load(__DIR__.'/config/{packages,parameters}.yaml');
$loader->load(__DIR__.'/config/{packages}/*_debug.yaml'); // Load debug collectors
}
Custom Dumpers Not Working:
use Symfony\Component\VarDumper\Dumper\AbstractDumper;
$this->app->extend('var_dumper', function ($varDumper) {
$varDumper->addDumper(new class extends AbstractDumper {
public function dump($var, DumperInterface $dumper) {
// Custom logic
}
});
return $varDumper;
});
Slow CLI Commands:
php artisan debug:container --show-private --limit=10
Custom Profiler Panels:
class RateLimitPanel extends DataCollector {
public function collect(Request $request, HttpKernelInterface $kernel, Request $masterRequest) {
$this->data['limits'] = RateLimiter::getStats();
}
}
AppKernel:
$collectors[] = new RateLimitPanel();
Debugging Middleware:
class DebugMiddleware implements MiddlewareInterface {
public function handle(Request $request, Closure $next) {
if ($request->hasPreviousSession()) {
dump($request->getSession()->all());
}
return $next($request);
}
}
**Event Listener
How can I help you explore Laravel packages today?