laravel-api-architect
Laravel API Architect
Production-grade API development with Service-Repository pattern for PHP 8.4+ and Laravel 12+.
Core Principles
- Thin Controllers - HTTP concerns only, delegate business logic to Services
- Service Layer - Business logic, transactions, events
- Repository Layer - Complex queries (optional, use when needed)
- Type Everything - Return types, parameter types, property types
- Form Requests - Validation never in controllers
- API Resources - Response transformation, never return models directly
Architecture Quick Reference
| Layer | Responsibility | Depends On |
|---|---|---|
| Controller | HTTP request/response | Services, FormRequests |
| Service | Business logic, transactions | Repositories, Models, Events |
| Repository | Complex/reusable queries | Models |
| Model | Data, relationships, scopes | Other Models only |
Essential Patterns
Controller Pattern
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Requests\StoreOrderRequest;
use App\Http\Resources\OrderResource;
use App\Models\Order;
use App\Services\OrderService;
use Illuminate\Http\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
final class OrderController extends Controller
{
public function __construct(
private readonly OrderService $orderService
) {}
public function index(): JsonResponse
{
$orders = Order::query()
->forUser(auth()->id())
->with(['items'])
->latest()
->paginate(15);
return response()->json(OrderResource::collection($orders));
}
public function store(StoreOrderRequest $request): JsonResponse
{
$order = $this->orderService->create($request->validated());
return response()->json(
new OrderResource($order),
Response::HTTP_CREATED
);
}
public function show(Order $order): JsonResponse
{
$this->authorize('view', $order);
return response()->json(
new OrderResource($order->load(['items', 'payments']))
);
}
public function destroy(Order $order): JsonResponse
{
$this->authorize('delete', $order);
$order->delete();
return response()->json(null, Response::HTTP_NO_CONTENT);
}
}
Service Pattern
<?php
namespace App\Services;
use App\Events\OrderCreated;
use App\Models\Order;
use Illuminate\Support\Facades\DB;
final class OrderService
{
public function create(array $data): Order
{
return DB::transaction(function () use ($data): Order {
$order = Order::query()->create([
'user_id' => auth()->id(),
'status' => OrderStatus::Pending,
'total' => $data['total'],
]);
$order->items()->createMany($data['items']);
event(new OrderCreated($order));
return $order->load('items');
});
}
}
Form Request Pattern
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
final class StoreOrderRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
public function rules(): array
{
return [
'total' => ['required', 'numeric', 'min:0'],
'items' => ['required', 'array', 'min:1'],
'items.*.product_id' => [
'required',
Rule::exists('products', 'id')->where('active', true),
],
'items.*.quantity' => ['required', 'integer', 'min:1', 'max:100'],
];
}
}
API Resource Pattern
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
final class OrderResource extends JsonResource
{
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'status' => $this->status->value,
'total' => $this->total,
'created_at' => $this->created_at->toISOString(),
// Conditional relationships
'user' => new UserResource($this->whenLoaded('user')),
'items' => OrderItemResource::collection($this->whenLoaded('items')),
// Conditional attributes
'can_cancel' => $this->when(
$request->user()?->can('cancel', $this->resource),
true
),
];
}
}
References
Load detailed patterns as needed:
| Topic | Reference | When to Load |
|---|---|---|
| Sanctum authentication | references/sanctum.md | Token auth, SPA auth, abilities |
| Passport OAuth | references/passport.md | OAuth2, third-party apps |
| Service-Repository details | references/service-repository.md | Complex business logic |
Quick Commands
# Create with best practices
php artisan make:model Order -mfsc # Model, migration, factory, seeder, controller
php artisan make:request StoreOrderRequest
php artisan make:resource OrderResource
php artisan make:policy OrderPolicy --model=Order
# API Routes
php artisan route:list --path=api
# Format code
./vendor/bin/pint
Remember
- Use
->query()for IDE completion:Order::query()->where(...) - Use
final classfor services and controllers - Use
readonlyconstructor properties - Use
matchover complex if/else - Use Enums for status fields
- Always return
JsonResponse, never raw arrays - Use HTTP status constants:
Response::HTTP_CREATED
More from anilcancakir/my-claude-code
flutter-design
Flutter/Dart implementation patterns for Refactoring UI principles. COMPANION skill for mobile-app-design-mastery. ALWAYS activate for: Flutter theming, ThemeData, ColorScheme, TextTheme, BoxDecoration, Material 3, Flutter shadows, Flutter spacing, Flutter typography, Flutter dark mode, Flutter components, Flutter styling, Dart UI, Widget decoration. Provides ThemeData setup, color schemes, typography styles, spacing utilities, decoration patterns. Turkish: Flutter tema, Flutter renk, Flutter tasarım, Dart UI, widget stil. English: Flutter theming, Material Design, Flutter styling, widget decoration.
74tailwindcss-design
TailwindCSS implementation patterns for Refactoring UI principles. COMPANION skill for web-design-mastery. ALWAYS activate for: TailwindCSS, Tailwind classes, utility classes, Tailwind config, Tailwind components, Tailwind dark mode, Tailwind responsive, Tailwind spacing, Tailwind typography, Tailwind colors, Tailwind shadows. Provides class recipes, component patterns, dark mode implementation, responsive patterns. Turkish: Tailwind kullanımı, Tailwind class, utility CSS, Tailwind config. English: Tailwind patterns, utility-first CSS, Tailwind best practices.
56mobile-app-design-mastery
Production-grade mobile application UI design based on Refactoring UI principles. ALWAYS activate for: Flutter app, mobile app, iOS app, Android app, mobile UI, app screens, mobile navigation, bottom sheets, mobile forms, touch targets, mobile typography, app color scheme, mobile cards, list views, mobile modals, tab bars, app bars, floating action buttons. Provides mobile design workflow, touch-optimized spacing, mobile typography scale, platform-aware patterns. Turkish: mobil uygulama tasarımı, Flutter tasarım, uygulama arayüzü, mobil UI, telefon uygulaması, Android tasarım, iOS tasarım. English: app design, mobile interface, touch-friendly, native feel, mobile UX.
35web-design-mastery
Production-grade web application UI design based on Refactoring UI principles. ALWAYS activate for: landing page, dashboard, auth screens, hero sections, card design, button design, form inputs, navigation, layouts, spacing decisions, typography hierarchy, color selection, shadows, depth, empty states, background decoration. Provides design workflow, visual hierarchy, spacing systems (4px grid), type scale, HSL color systems, shadow elevation, finishing touches. Turkish: sayfa tasarımı, UI/UX, frontend tasarım, web tasarım, güzel arayüz, modern tasarım, card tasarımı, buton stili, form tasarımı, renk paleti, tipografi. English: beautiful interface, sleek design, premium feel, visual hierarchy, whitespace, color palette, typography scale.
34laravel-infrastructure
Laravel Horizon queues, Octane performance, Reverb WebSockets, Redis caching, PostgreSQL database. ALWAYS activate when: working with queue jobs, cache, sessions, broadcasting, database performance, supervisor, worker. Triggers on: job failed, queue stuck, cache not clearing, Redis connection, broadcast event, WebSocket, real-time, Horizon dashboard, Octane memory leak, slow query, N+1, database timeout, connection refused, kuyruk çalışmıyor, cache temizlenmiyor, job başarısız, worker durdu, broadcast çalışmıyor, real-time gelmiyor.
10laravel-fullstack
Laravel Blade views, Alpine.js, Vue.js integration, TailwindCSS styling, Vite assets. ALWAYS activate when: working with resources/views/, Blade components, frontend forms, UI elements, modals, dropdowns, forms. Triggers on: görünmüyor, gösterilmiyor, sayfa yüklenmiyor, sayfa açılmıyor, form çalışmıyor, form gönderilmiyor, buton çalışmıyor, button not working, style bozuk, CSS bozuk, renk yanlış, color wrong, responsive bozuk, mobile görünüm, dark mode çalışmıyor, layout bozuk, component çalışmıyor, modal açılmıyor, dropdown çalışmıyor, asset yüklenmiyor, image not loading, JS error, JavaScript hatası.
10