У запит форми (Form Request) і політику - тоді контролер отримує вже перевірені дані.
class StoreOrderRequest extends FormRequest
{
public function authorize(): bool
{
return $this->user()->can('create', Order::class);
}
public function rules(): array
{
return [
'items' => ['required', 'array', 'max:50'],
'items.*.product_id' => ['required', 'exists:products,id'],
];
}
}
class OrderController
{
public function store(StoreOrderRequest $request, PlaceOrder $placeOrder): RedirectResponse
{
$order = $placeOrder($request->user(), $request->validated());
return redirect()->route('orders.show', $order);
}
}
Розподіл відповідальності:
- Form Request - формат вхідних даних і, за потреби, доступ до дії;
- Політика - правила доступу до моделі (
update,delete), щоб їх перевикористовували контролери, Livewire, API й Blade (@can); - Дія чи сервіс - бізнес-логіка, яка не знає про HTTP;
- Контролер - лише склеює: приймає запит, викликає дію, повертає відповідь.
Перевага не лише в чистоті: запит форми й політику тестують окремо, а ту саму дію викликають з команди чи черги без підробки HTTP-запиту.