| name | laravel-12 |
| description | Expert guidance for building Laravel 12 applications following best practices, modern conventions, and the streamlined Laravel 12 architecture. Use this skill when creating Laravel projects, working with Eloquent models, building APIs, implementing authentication, writing tests, or any Laravel development task. |
Laravel 12 Development Skill
This skill provides comprehensive guidance for developing high-quality Laravel 12 applications using modern best practices, proper architecture patterns, and Laravel's streamlined structure.
Purpose
Provide expert-level Laravel 12 development guidance covering:
- Modern Laravel 12 streamlined architecture and file structure
- Eloquent ORM patterns with proper type hints and relationships
- Authentication and authorization using current best practices
- Form validation with Form Request classes
- Queue and job management for background processing
- Database migrations, models, and API development
- Testing patterns and conventions
- Configuration and environment management
When to Use
Use this skill when:
- Creating or working with Laravel 12 applications
- Building models, controllers, migrations, or any Laravel components
- Implementing authentication or authorization
- Creating APIs with Eloquent resources
- Writing database queries or working with relationships
- Setting up queues and background jobs
- Writing form validation
- Configuring Laravel applications
- Following Laravel best practices and conventions
- Ensuring proper Laravel 12 structure compliance
Core Principles
1. Use Artisan Commands
Always create files using php artisan make: commands with appropriate options:
# Models with migrations, factories, seeders
php artisan make:model Post -mfs
# Form Requests for validation
php artisan make:request StorePostRequest
# Controllers
php artisan make:controller PostController --resource
# Jobs
php artisan make:job ProcessPodcast
# Generic PHP classes
php artisan make:class Services/PaymentService
Important: Pass --no-interaction when running commands programmatically.
2. Follow Laravel 12 Streamlined Structure
Laravel 12 uses a simplified structure:
- No
app/Http/Middleware/directory - register middleware inbootstrap/app.php - No
app/Console/Kernel.php- usebootstrap/app.phporroutes/console.php - Commands auto-register from
app/Console/Commands/ - Central configuration in
bootstrap/app.phpfor middleware, routing, exceptions
Read references/structure.md for complete details on Laravel 12 architecture.
3. Authentication: Always Use $request->user()
CRITICAL: Always retrieve authenticated user via $request->user(), never use auth()->user() or Auth::user():
// ✅ CORRECT
public function index(Request $request): Response
{
$user = $request->user();
// ...
}
// ❌ WRONG
public function index(): Response
{
$user = auth()->user(); // Don't do this
}
Read references/authentication.md for complete authentication and authorization guidance.
4. Database: Eloquent Over DB Facade
Prefer Eloquent models and relationships over raw queries:
// ✅ PREFER
$users = User::query()->where('active', true)->get();
// ❌ AVOID
$users = DB::table('users')->where('active', true)->get();
Prevent N+1 queries by eager loading relationships:
// ✅ GOOD - Prevents N+1
$posts = Post::with('user', 'comments')->get();
// ❌ BAD - Causes N+1
$posts = Post::all();
foreach ($posts as $post) {
echo $post->user->name; // New query each iteration
}
Read references/database.md for Eloquent patterns, relationships, migrations, and query optimization.
5. Validation: Always Use Form Requests
Never use inline validation. Always create Form Request classes:
php artisan make:request StorePostRequest
Form Requests should include:
- Validation rules (check project conventions for array vs string format)
- Custom error messages
- Authorization logic when needed
public function rules(): array
{
return [
'title' => ['required', 'string', 'max:255'],
'body' => ['required', 'string'],
];
}
Read references/validation.md for complete validation patterns and examples.
6. Configuration: Never Use env() Outside Config Files
// ❌ WRONG
$apiKey = env('API_KEY');
// ✅ CORRECT
$apiKey = config('services.api.key');
Environment variables should only be accessed in config/*.php files, then accessed via config() helper throughout the application.
7. Background Processing: Use Queues
Use queued jobs with ShouldQueue interface for time-consuming operations:
php artisan make:job ProcessPodcast
class ProcessPodcast implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public int $tries = 3;
public int $timeout = 120;
public function __construct(public Podcast $podcast) {}
public function handle(): void
{
$this->podcast->process();
}
}
Read references/queues.md for queue patterns, job chains, batches, and worker management.
Working with Models
Model Creation
When creating models, use appropriate flags:
# Model with migration, factory, seeder
php artisan make:model Post -mfs
# Model with migration, factory, seeder, policy, controller
php artisan make:model Post -mfsc --policy
Model Conventions
- Use return type hints on relationships:
public function posts(): HasMany
{
return $this->hasMany(Post::class);
}
- Use
casts()method for type casting:
protected function casts(): array
{
return [
'published_at' => 'datetime',
'is_featured' => 'boolean',
'metadata' => 'array',
];
}
- Use constructor property promotion:
public function __construct(
public string $name,
public int $age,
) {}
Working with Controllers
- Type-hint Request in controller methods
- Use resource controllers for CRUD operations
- Return proper response types with type hints
- Use Form Requests for validation
- Keep controllers thin - move business logic to services/actions
public function store(StorePostRequest $request): RedirectResponse
{
$post = Post::create($request->validated());
return redirect()->route('posts.show', $post);
}
API Development
Use Eloquent API Resources for consistent API responses:
php artisan make:resource PostResource
class PostResource extends JsonResource
{
public function toArray($request): array
{
return [
'id' => $this->id,
'title' => $this->title,
'author' => new UserResource($this->whenLoaded('user')),
];
}
}
Migrations
CRITICAL: When modifying columns, include ALL previous attributes or they will be lost:
// ❌ WRONG - Loses 'nullable' attribute
$table->string('email')->unique()->change();
// ✅ CORRECT - Preserves all attributes
$table->string('email')->nullable()->unique()->change();
Reference Files
This skill includes detailed reference files for specific topics:
references/structure.md- Laravel 12 file structure, Artisan commands, configurationreferences/authentication.md- Authentication, authorization, policies, gatesreferences/database.md- Eloquent, relationships, migrations, queries, API resourcesreferences/validation.md- Form Requests, validation rules, custom messagesreferences/queues.md- Jobs, queues, workers, chains, batches
Read the appropriate reference file(s) when working on related tasks to ensure following best practices.
PHP Conventions
- Always use curly braces for control structures, even single-line
- Use explicit return type declarations for all methods
- Use PHP 8+ constructor property promotion
- Use type hints for method parameters
- Prefer PHPDoc blocks over inline comments
protected function isAccessible(User $user, ?string $path = null): bool
{
// Implementation
}
Best Practices Summary
- ✅ Use
php artisan make:commands to create files - ✅ Follow Laravel 12 streamlined structure
- ✅ Always use
$request->user()for authentication - ✅ Prefer Eloquent over DB facade
- ✅ Always create Form Request classes for validation
- ✅ Never use
env()outside config files - ✅ Use queues for time-consuming operations
- ✅ Add return type hints on relationships
- ✅ Eager load to prevent N+1 queries
- ✅ Include all attributes when modifying columns
- ✅ Use named routes with
route()helper - ✅ Use API Resources for APIs
- ✅ Keep controllers thin
- ✅ Write descriptive, type-safe code
Common Tasks Workflow
Creating a New Resource
- Create model with migrations and factory:
php artisan make:model Post -mf - Create Form Requests:
php artisan make:request StorePostRequest - Create controller:
php artisan make:controller PostController --resource - Create API resource (if needed):
php artisan make:resource PostResource - Define routes in appropriate routes file with named routes
- Write tests for all functionality
Adding Authentication to Routes
- Use middleware in route definition or
bootstrap/app.php - Access user via
$request->user() - Use policies for authorization
- Return appropriate responses for unauthorized access
This skill ensures Laravel applications follow modern best practices, maintain clean architecture, and leverage Laravel 12's streamlined structure effectively.