Laravel layihəsi sadə başlayır: marşrut, controller, Eloquent modeli. Bu uzun müddət kifayət edir. Problem controller metodu eyni anda məlumatı yoxlayanda, tranzaksiya açanda, ödəniş çəkəndə, e-poçt göndərəndə və JSON qurduqda yaranır. Sonra eyni qayda konsol komandasına köçürülür, test üçün tam HTTP sorğusu lazım olur və metoda toxunmağa heç kim cəsarət etmir.

Arxitektura nümunələri bir suala cavab verir: hansı kod parçası hansı sinifdə yaşayır. Bunlar qayda deyil, alətdir və hər biri əlavə fayl bahasına başa gəlir.

Nazik controller və DTO

Controller HTTP-ni çağırışa, nəticəni isə yenidən HTTP-yə çevirir. Validasiya və icazə FormRequest-ə, qayda Action-a, cavabın forması Resource-a verilir.

php
public function store(Request $request)
{
    $data = $request->validate(['items' => 'required|array']);

    $order = DB::transaction(function () use ($request, $data) {
        $order = Order::create(['user_id' => $request->user()->id]);
        $order->items()->createMany($data['items']);

        return $order;
    });

    Mail::to($request->user())->send(new OrderPlacedMail($order));

    return response()->json($order, 201);
}

Bölünmədən sonra eyni endpoint:

php
public function store(
    StoreOrderRequest $request,
    PlaceOrder $action,
): JsonResponse {
    $order = $action->handle(PlaceOrderData::fromRequest($request));

    return OrderResource::make($order)
        ->response()
        ->setStatusCode(201);
}
Sorğunun qatlar üzrə yolu
Sorğunun qatlar üzrə yolu

Controller ilə Action arasında DTO (data transfer object) ötürülür: array və ya bütün Request əvəzinə tipli sahələri olan kiçik sinif.

php
namespace App\DataTransferObjects;

use App\Http\Requests\StoreOrderRequest;

final readonly class PlaceOrderData
{
    public function __construct(
        public int $userId,
        public array $items,
        public ?string $coupon = null,
    ) {}

    public static function fromRequest(StoreOrderRequest $request): self
    {
        return new self(
            userId: $request->user()->id,
            items: $request->validated('items'),
            coupon: $request->validated('coupon'),
        );
    }
}

💡 readonly class PHP 8.2 və ya daha yeni versiya tələb edir. Laravel 12 PHP 8.2+ tələb edir, ona görə o həmişə mövcuddur. HTTP haqqında yalnız fromRequest() bilir, buna görə Action komandadan, job-dan və testdən də çağrıla bilir.

Action sinifləri