skills/laravel/SKILL.md
Laravel mastery skill. Eloquent ORM, service container, queues, events, Sanctum/Passport auth, Pest testing. Triggers on: /godmode:laravel, "laravel app", "eloquent", "artisan", "blade".
npx skillsauth add arbazkhan971/godmode laravelInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
/godmode:laravel# Detect Laravel version
php artisan --version 2>/dev/null
php -v | head -1
# Check for common issues
php artisan route:list --json | wc -l
php artisan config:show app.debug 2>/dev/null
LARAVEL ASSESSMENT:
Laravel: <11.x>, PHP: <8.3.x>
Architecture: Full-stack (Blade) | API-only | Inertia
Database: MySQL | PostgreSQL | SQLite
Queue: Redis | Database | SQS
Auth: Sanctum | Passport | Breeze | Jetstream
IF PHP < 8.2: recommend upgrade (performance + types)
IF using $guarded = []: switch to explicit $fillable
IF no preventLazyLoading: enable in AppServiceProvider
QUERY OPTIMIZATION:
| Pattern | Usage |
|------------------------|--------------------|
| with('relation') | Eager load (N+1) |
| withCount('relation') | Count without load |
| select('col1','col2') | Reduce memory |
| chunk(1000, fn) | Large datasets |
| cursor() | One-by-one stream |
THRESHOLDS:
N+1 tolerance: 0 (use preventLazyLoading)
chunk size: 1000 records per batch
Model::all() in production: NEVER
IF query count > 10 per request: audit with Debugbar
RULES:
Always with() for displayed relationships
Always use API Resources (never raw models)
Always backed enums for status fields (PHP 8.1+)
Always index foreign keys and WHERE columns
IF processing > 100 records: use chunk/cursor
SERVICE ARCHITECTURE:
| Pattern | When to Use |
|---------------------|---------------------|
| Action classes | Complex single ops |
| Service classes | Related operations |
| Repository pattern | Abstract data access |
| DTOs | Typed input/output |
| Contracts | Swappable impls |
| Pipelines | Sequential steps |
RULES:
Bind interfaces in service providers
Action classes: one public method (execute)
Constructor injection over facades
DB::transaction() for atomicity
IF business logic in controller: extract to service
// Job with retry configuration
class ProcessPayment implements ShouldQueue
{
use Dispatchable, InteractsWithQueue,
Queueable, SerializesModels;
public $tries = 3;
public $backoff = [10, 60, 300]; // seconds
public $timeout = 120;
}
ASYNC RULES:
Jobs MUST be idempotent (safe to retry)
Use $backoff array for exponential backoff
Use WithoutOverlapping for same-entity ops
Use ShouldBeUnique to prevent duplicates
Events for side effects (email, notification)
IF job runs > 30s: consider breaking into chain
THRESHOLDS:
Job timeout: 120s default, 300s max
Retry attempts: 3 (with backoff)
Queue monitoring: Horizon for Redis
IF queue depth > 1000: scale workers
AUTH SELECTION:
| Method | When to Use |
|-------------|--------------------------|
| Sanctum SPA | Same-domain SPA |
| Sanctum token| Mobile, third-party |
| Passport | Full OAuth2 server |
| Breeze | Simple auth scaffold |
| Jetstream | Auth + teams + 2FA |
RULES:
Every endpoint must check Policy or Gate
Authorization bugs are security bugs
IF API + SPA: Sanctum stateful cookies
IF API + mobile: Sanctum token-based
# Run tests
php artisan test --parallel
# Run with coverage
php artisan test --coverage --min=80
TESTING STRATEGY:
| Layer | Approach |
|-------------|--------------------------|
| Models | Pest + Factories |
| API | Pest + actingAs |
| Jobs | Queue::fake + assertions |
| Events | Event::fake |
| Policies | authorize assertions |
| Validation | assertUnprocessable |
RULES:
Use RefreshDatabase (wraps in transactions)
Use factory states for variations
Test authorization in every endpoint test
assertDatabaseHas for persistence verification
IF coverage < 80%: add tests for uncovered routes
THRESHOLDS:
Coverage target: >= 80% overall
Endpoint coverage: 100% of routes
IF test suite > 60s: enable --parallel
LARAVEL VALIDATION:
| Check | Status |
|-------------------------------|--------|
| preventLazyLoading enabled | ? |
| Eager loading on endpoints | ? |
| API Resources (no raw models) | ? |
| Form Requests for validation | ? |
| Policies on all endpoints | ? |
| Jobs idempotent with backoff | ? |
| Config cached for production | ? |
| Routes cached for production | ? |
Commit: "laravel: <app> — <N> models, <M> endpoints, Pest"
# Laravel development and testing
php artisan test --parallel
php artisan route:list --compact
composer audit
# Laravel testing and auditing
php artisan test --parallel
composer audit
curl -s http://localhost:8000/health
Never ask to continue. Loop autonomously until done.
1. Laravel: artisan file, composer.json laravel/framework
2. PHP: composer.json require.php version
3. Architecture: routes/web.php, routes/api.php
Print: Laravel: {action}, {models} models, {endpoints} endpoints. Tests: {status}. Verdict: {verdict}.
timestamp project models controllers migrations tests status
KEEP if: tests pass AND quality improved
DISCARD if: tests fail OR performance regressed
STOP when ANY of:
- All tasks complete and validated
- User requests stop
- Max iterations reached
<!-- tier-3 -->
development
Web performance optimization. Lighthouse, bundle analysis, code splitting, image optimization, critical CSS, fonts, service workers, CDN.
development
Webhook design, delivery, retry, HMAC verification, event subscriptions, dead letter queues.
development
Vue.js mastery. Composition API, Pinia, Vue Router, Nuxt SSR/SSG, Vite optimization, testing.
development
Evidence gate. Run command, read full output, confirm or deny claim. No trust, only proof.