Laravel Essentials Routing & Controllers // routes/api.php use App\Http\Controllers\UserController; Route::get('/users', [UserController::class, 'index']); Rout…
Laravel Essentials
Routing & Controllers
// routes/api.php
use App\Http\Controllers\UserController;
Route::get('/users', [UserController::class, 'index']);
Route::post('/users', [UserController::class, 'store']);
Route::get('/users/{user}', [UserController::class, 'show']);
Route::put('/users/{user}', [UserController::class, 'update']);
Route::delete('/users/{user}', [UserController::class, 'destroy']);
// Resource routes (all 7 actions at once)
Route::apiResource('users', UserController::class);
// Route groups with middleware
Route::middleware(['auth:sanctum'])->group(function () {
Route::apiResource('posts', PostController::class);
Route::get('/profile', [ProfileController::class, 'show']);
});
// app/Http/Controllers/UserController.php
class UserController extends Controller
{
public function index(Request $request): JsonResponse
{
$users = User::when($request->search, fn($q, $s) =>
$q->where('name', 'like', "%{$s}%")
)->paginate(20);
return response()->json($users);
}
public function store(StoreUserRequest $request): JsonResponse
{
$user = User::create($request->validated());
return response()->json($user, 201);
}
public function show(User $user): JsonResponse // route model binding
{
return response()->json($user->load('posts'));
}
public function update(UpdateUserRequest $request, User $user): JsonResponse
{
$user->update($request->validated());
return response()->json($user);
}
public function destroy(User $user): Response
{
$user->delete();
return response()->noContent();
}
}
Eloquent ORM
// Model definition
class User extends Model
{
protected $fillable = ['name', 'email', 'password'];
protected $hidden = ['password', 'remember_token'];
protected $casts = [
'email_verified_at' => 'datetime',
'settings' => 'array',
'is_active' => 'boolean',
];
// Relationships
public function posts(): HasMany { return $this->hasMany(Post::class); }
public function profile(): HasOne { return $this->hasOne(Profile::class); }
public function roles(): BelongsToMany { return $this->belongsToMany(Role::class); }
// Accessors / mutators (Laravel 9+)
protected function password(): Attribute
{
return Attribute::set(fn($v) => bcrypt($v));
}
// Scopes
public function scopeActive($query) { return $query->where('is_active', true); }
public function scopeSearch($query, $term) {
return $query->where('name', 'like', "%{$term}%");
}
}
// Querying
User::all();
User::find(1);
User::findOrFail(1);
User::where('email', 'a@b.com')->first();
User::active()->search('alice')->paginate(20);
User::with('posts.comments')->get(); // eager loading
User::withCount('posts')->orderBy('posts_count')->get();
// Create / update / delete
User::create(['name' => 'Alice', 'email' => 'a@a.com']);
User::updateOrCreate(['email' => 'a@a.com'], ['name' => 'Alice']);
$user->update(['name' => 'Bob']);
$user->delete();
User::where('is_active', false)->delete(); // bulk delete
Migrations & Validation
// Migrations
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
$table->string('title');
$table->string('slug')->unique();
$table->longText('body');
$table->enum('status', ['draft', 'published'])->default('draft');
$table->timestamp('published_at')->nullable();
$table->timestamps();
$table->softDeletes();
$table->index(['user_id', 'status']);
});
// php artisan make:migration create_posts_table
// php artisan migrate
// php artisan migrate:rollback
// php artisan migrate:fresh --seed
// Form Request validation
class StoreUserRequest extends FormRequest
{
public function rules(): array
{
return [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'email', 'unique:users,email'],
'password' => ['required', 'min:8', 'confirmed'],
'role' => ['required', Rule::in(['admin', 'user'])],
];
}
public function authorize(): bool { return true; }
}
// Artisan commands
// php artisan make:model Post -mcr // model + migration + controller + resource
// php artisan make:request StorePostRequest
// php artisan route:list
// php artisan tinker