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.
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:
public function store(
StoreOrderRequest $request,
PlaceOrder $action,
): JsonResponse {
$order = $action->handle(PlaceOrderData::fromRequest($request));
return OrderResource::make($order)
->response()
->setStatusCode(201);
}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.
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 classPHP 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ızfromRequest()bilir, buna görə Action komandadan, job-dan və testdən də çağrıla bilir.