# Laravel Patterns ## Service Layer Pattern ```php userRepository->create([ 'name' => $data->name, 'email' => $data->email, 'password' => Hash::make($data->password), ]); $this->emailService->sendWelcomeEmail($user); return $user; } public function suspendUser(int $userId, string $reason): void { $user = $this->userRepository->findOrFail($userId); $this->userRepository->update($user->id, [ 'status' => UserStatus::SUSPENDED, 'suspension_reason' => $reason, 'suspended_at' => now(), ]); $this->emailService->sendSuspensionNotice($user, $reason); } } ``` ## Repository Pattern ```php first(); } public function create(array $data): User { return User::create($data); } public function update(int $id, array $data): User { $user = $this->findOrFail($id); $user->update($data); return $user->fresh(); } public function delete(int $id): void { $this->findOrFail($id)->delete(); } public function getActive(): Collection { return User::where('status', UserStatus::ACTIVE) ->orderBy('created_at', 'desc') ->get(); } } ``` ## Form Requests with Enums ```php user()?->can('create', User::class) ?? false; } public function rules(): array { return [ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'email', 'unique:users,email'], 'password' => ['required', Password::min(8)->mixedCase()->numbers()], 'role' => ['required', new Enum(UserRole::class)], 'settings' => ['sometimes', 'array'], 'settings.theme' => ['string', Rule::in(['light', 'dark'])], ]; } public function toDto(): CreateUserData { return new CreateUserData( name: $this->validated('name'), email: $this->validated('email'), password: $this->validated('password'), role: UserRole::from($this->validated('role')), ); } } ``` ## API Resources ```php $this->id, 'name' => $this->name, 'email' => $this->email, 'status' => $this->status->value, 'role' => $this->role->value, 'created_at' => $this->created_at->toIso8601String(), // Conditional relationships 'posts' => PostResource::collection($this->whenLoaded('posts')), 'profile' => new ProfileResource($this->whenLoaded('profile')), // Conditional attributes 'is_admin' => $this->when($this->role === UserRole::ADMIN, true), // Pivot data 'team_role' => $this->whenPivotLoaded('team_user', fn() => $this->pivot->role ), ]; } } final class UserCollection extends ResourceCollection { public function toArray(Request $request): array { return [ 'data' => $this->collection, 'meta' => [ 'total' => $this->total(), 'per_page' => $this->perPage(), ], ]; } } ``` ## Controllers with DTOs ```php where('status', UserStatus::ACTIVE) ->paginate(20); return UserResource::collection($users); } public function store(CreateUserRequest $request): JsonResponse { $user = $this->userService->createUser($request->toDto()); return (new UserResource($user)) ->response() ->setStatusCode(201); } public function show(User $user): UserResource { $user->load(['posts', 'profile']); return new UserResource($user); } public function destroy(User $user): JsonResponse { $this->authorize('delete', $user); $this->userService->deleteUser($user->id); return response()->json(null, 204); } } ``` ## Jobs & Queues ```php userId); $emailService->sendWelcomeEmail($user); } public function failed(\Throwable $exception): void { \Log::error('Failed to send welcome email', [ 'user_id' => $this->userId, 'error' => $exception->getMessage(), ]); } } // Dispatching jobs SendWelcomeEmail::dispatch($user->id); SendWelcomeEmail::dispatch($user->id)->delay(now()->addMinutes(5)); SendWelcomeEmail::dispatch($user->id)->onQueue('emails'); ``` ## Event Listeners ```php user->id); } } // In EventServiceProvider protected $listen = [ UserRegistered::class => [ SendWelcomeNotification::class, UpdateUserStatistics::class, ], ]; ``` ## Quick Reference | Pattern | Purpose | File Location | |---------|---------|---------------| | Service | Business logic | `app/Services/` | | Repository | Data access | `app/Repositories/` | | Form Request | Validation | `app/Http/Requests/` | | Resource | API responses | `app/Http/Resources/` | | Job | Async tasks | `app/Jobs/` | | Event | Domain events | `app/Events/` | | DTO | Data transfer | `app/DTOs/` | | Policy | Authorization | `app/Policies/` |