$request->all() повертає все, що надіслав клієнт: поля форми, параметри запиту, зайві поля, яких у формі немає. Передавати це в модель чи логіку - довіряти клієнту.
$request->validated() (чи результат $request->validate([...])) - лише ті поля, для яких описано правила, і лише після успішної перевірки:
public function update(UpdateProfileRequest $request)
{
$request->user()->update($request->validated());
}
Зайве поле is_admin=1 у запиті просто не потрапить в update().
$request->safe() - перевірені дані як об'єкт з корисними методами:
$request->safe()->only(['name', 'email']);
$request->safe()->except(['password']);
$request->safe()->merge(['user_id' => $request->user()->id]);
Чому валідація - це безпека, а не лише зручність:
- типи:
integer,string,array,booleanгарантують, що далі код отримає очікуваний тип. JSON може надіслати масив замість рядка чиtrueзамість числа - і код поведеться несподівано (нестрогі порівняння, помилки, обхід перевірок); - межі:
maxдля рядків і масивів захищає від мегабайтних полів і масивів на мільйон елементів; - білі списки:
Rule::in([...])для статусів, сортування, ролей - значення поза списком не пройдуть; - існування й належність:
Rule::exists('categories', 'id')->where('team_id', $teamId)- обрана категорія існує й належить команді користувача.
Типові помилки:
- валідація є, але далі використовується
$request->input('field')для поля, якого немає в правилах, - воно не перевірене; $request->only([...])без валідації - фільтрує поля, але не перевіряє значення;- правила
sometimes/nullableбезrequiredтам, де поле обов'язкове для безпеки; - валідація лише на фронтенді - запит можна надіслати напряму.
Form Request поєднує валідацію з авторизацією (authorize()) і робить контролер чистим - а validated() у ньому стає звичкою за замовчуванням.
Докладніше в документації: Laravel: робота з перевіреними даними