| name | laravel-devtoolbox-cli |
| description | Swiss-army artisan CLI for Laravel to scan, inspect, debug, and explore every aspect of your Laravel application from the command line |
| triggers | ["analyze my laravel application structure","find unused routes in laravel","trace sql queries for a route","generate model relationship diagram","scan laravel models and relationships","check for unprotected laravel routes","analyze laravel performance and memory","compare laravel environment files"] |
Laravel Devtoolbox CLI
Skill by ara.so — Devtools Skills collection.
Laravel Devtoolbox is a comprehensive CLI toolkit for Laravel applications that provides deep introspection, analysis, and debugging capabilities. It helps developers scan models, routes, services, database queries, security issues, and performance bottlenecks directly from the command line.
Installation
Install as a development dependency via Composer:
composer require --dev grazulex/laravel-devtoolbox
Requirements:
- PHP 8.3+
- Laravel 11.x or 12.x
Core Concepts
Laravel Devtoolbox provides multiple categories of analysis commands:
- Application Scanning - Comprehensive health checks and overview
- Model Analysis - Eloquent models, relationships, and usage
- Route Analysis - Route inspection, unused detection, reverse lookup
- Database Analysis - SQL tracing, N+1 detection, column usage
- Security Analysis - Unprotected routes, middleware coverage
- Performance Analysis - Memory, slow queries, cache, queue analysis
- Container Analysis - Service bindings, providers, dependency injection
All commands support multiple output formats: array (default), json, count, mermaid.
Key Commands
Application Overview & Scanning
php artisan dev:about+ --extended --performance
php artisan dev:scan --all
php artisan dev:scan --models --routes --services
Model Analysis
php artisan dev:models
php artisan dev:models --format=json --output=models.json
php artisan dev:model:where-used App\\Models\\User
php artisan dev:model:graph --format=mermaid --output=relationships.mmd
Route Analysis
php artisan dev:routes
php artisan dev:routes:unused
php artisan dev:routes:where UserController
php artisan dev:routes:unused --format=json --output=unused-routes.json
Database & SQL Analysis
php artisan dev:sql:trace --route=dashboard
php artisan dev:sql:duplicates --route=users.index --threshold=3
php artisan dev:db:column-usage --unused-only
php artisan dev:performance:slow-queries --threshold=1000
Security Analysis
php artisan dev:security:unprotected-routes
php artisan dev:security:unprotected-routes --critical-only
php artisan dev:security:unprotected-routes --format=json --output=security-audit.json
Performance Analysis
php artisan dev:performance:memory --route=dashboard
php artisan dev:performance:slow-queries --threshold=1000
php artisan dev:cache:analysis --drivers=redis,file
php artisan dev:queue:analysis --failed-jobs --slow-jobs
Service Container & Providers
php artisan dev:services
php artisan dev:container:bindings --show-resolved
php artisan dev:providers:timeline --slow-threshold=100
php artisan dev:middleware
php artisan dev:middlewares:where-used auth
Environment & Configuration
php artisan dev:env:diff --against=.env.example
php artisan dev:log:tail --follow --level=error
php artisan dev:views
Configuration
Publish the configuration file:
php artisan vendor:publish --tag=devtoolbox-config
This creates config/devtoolbox.php:
<?php
return [
'default_format' => env('DEVTOOLBOX_FORMAT', 'array'),
'scanners' => [
'models' => [
'enabled' => true,
'paths' => [app_path('Models')],
],
'routes' => [
'enabled' => true,
'exclude_patterns' => ['debugbar.*', 'telescope.*'],
],
'performance' => [
'slow_query_threshold' => 1000,
'memory_limit_warning' => 128,
],
],
'export' => [
'default_path' => storage_path('devtoolbox'),
'json_pretty_print' => true,
],
];
Common Patterns
Daily Development Workflow
#!/bin/bash
echo "=== Application Health Check ==="
php artisan dev:about+ --extended
echo "Unused routes:"
php artisan dev:routes:unused --format=count
echo "Unprotected routes:"
php artisan dev:security:unprotected-routes --format=count
echo "Environment differences:"
php artisan dev:env:diff --against=.env.example
CI/CD Quality Gates
#!/bin/bash
php artisan dev:scan --all --format=json --output=reports/scan.json
php artisan dev:routes:unused --format=json --output=reports/unused-routes.json
php artisan dev:security:unprotected-routes --format=json --output=reports/security.json
UNUSED_ROUTES=$(php artisan dev:routes:unused --format=count | jq -r '.count')
UNPROTECTED_ROUTES=$(php artisan dev:security:unprotected-routes --format=count | jq -r '.count')
echo "Unused routes: $UNUSED_ROUTES"
echo "Unprotected routes: $UNPROTECTED_ROUTES"
if [ "$UNUSED_ROUTES" -gt 10 ]; then
echo "❌ Too many unused routes: $UNUSED_ROUTES (max: 10)"
exit 1
fi
if [ "$UNPROTECTED_ROUTES" -gt 5 ]; then
echo "❌ Too many unprotected routes: $UNPROTECTED_ROUTES (max: 5)"
exit 1
fi
echo "✅ Quality checks passed"
Generate Documentation
#!/bin/bash
mkdir -p docs/architecture
php artisan dev:models --format=json --output=docs/architecture/models.json
php artisan dev:model:graph --format=mermaid --output=docs/architecture/relationships.mmd
php artisan dev:routes --format=json --output=docs/architecture/routes.json
php artisan dev:container:bindings --format=json --output=docs/architecture/bindings.json
echo "✅ Documentation generated in docs/architecture/"
Performance Debugging Session
<?php
Model Usage Analysis
php artisan dev:model:where-used App\\Models\\User
php artisan dev:model:graph --format=mermaid --models=User,Post,Comment
php artisan dev:models --format=json | jq '.[] | select(.relationships | length > 5)'
Security Audit
#!/bin/bash
echo "=== Security Audit ==="
php artisan dev:security:unprotected-routes --format=json --output=security/unprotected.json
php artisan dev:middleware --format=json --output=security/middleware.json
php artisan dev:routes --format=json | \
jq '[.[] | select(.middleware | index("auth") | not)]' > security/no-auth.json
echo "Security reports saved to security/"
Real-World Examples
Example 1: Finding N+1 Query Problems
php artisan dev:sql:duplicates --route=posts.index --threshold=3
Fix in Controller:
<?php
namespace App\Http\Controllers;
use App\Models\Post;
class PostController extends Controller
{
public function index()
{
$posts = Post::with(['author', 'comments.user'])->get();
return view('posts.index', compact('posts'));
}
}
Example 2: Cleaning Up Unused Routes
php artisan dev:routes:unused --format=json --output=cleanup/unused-routes.json
cat cleanup/unused-routes.json | jq -r '.[] | .name'
Before cleanup:
<?php
Route::get('/old-dashboard', [OldDashboardController::class, 'index'])->name('old.dashboard');
Route::get('/legacy-users', [LegacyUserController::class, 'index'])->name('legacy.users');
Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
After cleanup (remove unused routes):
<?php
Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
Example 3: Documenting Application Architecture
mkdir -p docs/architecture
php artisan dev:models --format=json --output=docs/architecture/models.json
php artisan dev:model:graph --format=mermaid --output=docs/architecture/relationships.mmd
php artisan dev:routes --format=json --output=docs/architecture/routes.json
php artisan dev:services --format=json --output=docs/architecture/services.json
Use Mermaid diagram in README.md:
# Application Architecture
## Model Relationships
```mermaid
{{< include docs/architecture/relationships.mmd >}}
### Example 4: Performance Monitoring Script
```php
<?php
// scripts/performance-check.php
// Run this script before deployment
$routes = [
'home',
'dashboard',
'users.index',
'posts.index',
];
foreach ($routes as $route) {
echo "Checking route: $route\n";
// Check memory usage
shell_exec("php artisan dev:performance:memory --route=$route");
// Check SQL queries
shell_exec("php artisan dev:sql:duplicates --route=$route --threshold=3");
echo "\n";
}
Example 5: Automated Security Checks
name: Security Scan
on: [push, pull_request]
jobs:
security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.3'
- name: Install dependencies
run: composer install --prefer-dist --no-progress
- name: Run security scan
run: |
php artisan dev:security:unprotected-routes --format=json > security-report.json
UNPROTECTED=$(jq 'length' security-report.json)
echo "Found $UNPROTECTED unprotected routes"
if [ "$UNPROTECTED" -gt 5 ]; then
echo "::error::Too many unprotected routes: $UNPROTECTED"
exit 1
fi
- name: Upload security report
uses: actions/upload-artifact@v3
with:
name:
Troubleshooting
Command Not Found
If dev:* commands are not available:
php artisan clear-compiled
php artisan config:clear
php artisan cache:clear
composer dump-autoload
composer show grazulex/laravel-devtoolbox
Memory Issues with Large Applications
For large applications, increase memory limit:
php -d memory_limit=512M artisan dev:scan --all
memory_limit = 512M
Performance Issues with SQL Tracing
SQL tracing can be slow on routes with many queries:
php artisan dev:sql:duplicates --route=users.index --threshold=5
JSON Output Parsing
When using JSON output in scripts:
php artisan dev:models --format=json | jq '.'
php artisan dev:routes:unused --format=json | jq -r '.[] | .name'
php artisan dev:models --format=json | jq 'length'
Mermaid Diagram Rendering
If Mermaid diagrams are too large:
php artisan dev:model:graph --format=mermaid --models=User,Post,Comment
Export Path Issues
If output files fail to save:
mkdir -p storage/devtoolbox
chmod -R 775 storage/devtoolbox
php artisan dev:models --format=json --output=/tmp/models.json
Integration Examples
Laravel Telescope Integration
<?php
PHPStan/Larastan Integration
php artisan dev:routes:unused > unused.txt
php artisan dev:db:column-usage --unused-only > unused-columns.txt
Monitoring Dashboard Integration
#!/bin/bash
php artisan dev:scan --all --format=json > /var/metrics/laravel-scan.json
php artisan dev:performance:slow-queries --threshold=1000 --format=json > /var/metrics/slow-queries.json
php artisan dev:cache:analysis --format=json > /var/metrics/cache-analysis.json
curl -X POST https://monitoring.example.com/metrics \
-H "Content-Type: application/json" \
-d @/var/metrics/laravel-scan.json
Best Practices
- Run in Development Only - This package is designed for dev environments
- Use JSON for Automation - Always use
--format=json in CI/CD scripts
- Regular Health Checks - Run
dev:scan --all weekly to catch issues early
- Document Architecture - Use
dev:model:graph to maintain architecture diagrams
- Security First - Run
dev:security:unprotected-routes before deployments
- Performance Baseline - Establish baselines with
dev:performance:* commands
- Version Control Reports - Commit generated JSON reports for historical tracking