Installation
composer require app-dev-panel/kernel
Add to config/app.php under providers:
AppDevPanel\Kernel\KernelServiceProvider::class,
First Use Case: Debugging a Request
Enable the kernel in AppServiceProvider:
public function boot()
{
if (app()->environment('local')) {
\AppDevPanel\Kernel\Facades\Kernel::enable();
}
}
/app-dev-panel or configured path).Key Files to Explore
config/app-dev-panel.php (core configuration)app/Providers/AppDevPanelServiceProvider.php (if extended)resources/views/vendor/app-dev-panel/ (customization hooks)Kernel::onRequest() or Kernel::onException() to inject custom data:
Kernel::onRequest(function ($request) {
Kernel::collect('custom_data', ['user_id' => auth()->id()]);
});
if (app()->environment(['local', 'staging'])) {
Kernel::enable();
}
Kernel::collect('request') → Full request data.Kernel::collect('response') → Response headers/status.Kernel::collect('database') → Query logs (if DB::enableQueryLog() is set).Kernel::collect('custom_metric', fn() => [
'memory_usage' => memory_get_usage(true),
'peak_memory' => memory_get_peak_usage(true),
]);
config/app-dev-panel.php:
'storage' => [
'driver' => 'file', // or 'database', 'redis'
'path' => storage_path('app-dev-panel'),
],
$proxy = Kernel::proxy('https://api.example.com/data');
$response = $proxy->get();
Kernel::collect('proxy_response', $response->getBody());
config/app-dev-panel.php:
'retention' => [
'days' => 7, // Keep data for 7 days
'max_entries' => 1000, // Limit total entries
],
php artisan app-dev-panel:clear
Kernel::onJobProcessed(function ($job, $result) {
Kernel::collect('job_result', [
'job' => get_class($job),
'status' => $result->status(),
]);
});
Event::listen(function ($event) {
Kernel::collect('event', [
'name' => $event::class,
'payload' => $event->toArray(),
]);
});
Performance Overhead
if (app()->environment('local')) {
Kernel::collect('slow_query', fn() => DB::getQueryLog());
}
Storage Permissions
storage_path('app-dev-panel') lacks write permissions.chmod -R 775 storage/app-dev-panel
Database Storage Quirks
redis driver for temporary storage or limit retention:
'retention' => ['days' => 1],
Proxy System Limitations
$client = Kernel::proxy('https://api.example.com')->withOptions([
'timeout' => 10,
]);
Disable All Collectors Temporarily
Kernel::disableCollectors();
Re-enable specific ones:
Kernel::enableCollectors(['request', 'response']);
Log Kernel Events
Add to AppServiceProvider:
Kernel::onEvent(function ($event) {
Log::debug('Kernel event:', ['event' => $event]);
});
Custom UI Overrides
Override panel views in resources/views/vendor/app-dev-panel/:
cp vendor/app-dev-panel/kernel/resources/views/vendor/app-dev-panel/* resources/views/vendor/app-dev-panel/
Create a Custom Collector
Kernel::extendCollector('cache_stats', function () {
return [
'hits' => Cache::stats()['hits'] ?? 0,
'misses' => Cache::stats()['misses'] ?? 0,
];
});
Modify Storage Driver Publish config and extend:
php artisan vendor:publish --provider="AppDevPanel\Kernel\KernelServiceProvider" --tag="config"
Then override App\Providers\AppDevPanelServiceProvider::boot() to bind a custom storage handler.
Hook into Debugger UI
Use Kernel::addPanelTab() to inject custom tabs:
Kernel::addPanelTab('custom_tab', function () {
return view('app-dev-panel::custom-tab', [
'data' => Kernel::getCollected('custom_data'),
]);
});
How can I help you explore Laravel packages today?