РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
685 of 1392 menu

MassAssignmentException

Исключение MassAssignmentException выбрасывается, когда вы пытаетесь выполнить массовое присвоение значений полям модели Eloquent, которые не разрешены для массового заполнения. Это защитный механизм Laravel, предотвращающий случайное или злонамеренное изменение важных полей модели через методы create, update, fill или конструктор с массивом атрибутов. Массовое присвоение - это процесс передачи массива данных в модель для одновременной установки множества полей. Для защиты от массового присвоения Laravel использует два свойства модели: $fillable (белый список разрешённых полей) и $guarded (чёрный список запрещённых полей).

Синтаксис

<?php throw new MassAssignmentException($message, $code, $previous); ?>

Исключение имеет следующие параметры:

  • $message - сообщение об ошибке, описывающее причину возникновения исключения
  • $code - код ошибки (по умолчанию 0)
  • $previous - предыдущее исключение для цепочки ошибок

Пример

Рассмотрим модель User без указания разрешённых полей для массового заполнения:

<?php namespace AppModels; use IlluminateDatabaseEloquentModel; class User extends Model { // $fillable не определён } ?>

При попытке массового создания пользователя возникнет исключение:

<?php namespace AppHttpControllers; use AppModelsUser; use IlluminateHttpRequest; class UserController extends Controller { public function store(Request $request) { $user = User::create($request->all()); // MassAssignmentException: name не разрешено для массового присвоения return response()->json($user); } } ?>

Результат выполнения кода:

"MassAssignmentException: name"

Пример

Правильный способ защитить модель - определить свойство $fillable с перечнем разрешённых полей:

<?php namespace AppModels; use IlluminateDatabaseEloquentModel; class User extends Model { protected $fillable = [ 'name', 'email', 'password', ]; } ?>

Теперь массовое присвоение для указанных полей будет работать корректно:

<?php namespace AppHttpControllers; use AppModelsUser; use IlluminateHttpRequest; use IlluminateSupportFacadesHash; class UserController extends Controller { public function store(Request $request) { $validated = $request->validate([ 'name' => 'required|string', 'email' => 'required|email|unique:users', 'password' => 'required|string|min:8', ]); $validated['password'] = Hash::make($validated['password']); $user = User::create($validated); return response()->json($user); } } ?>

Результат выполнения кода:

{"id":1,"name":"John Doe","email":"john@example.com","updated_at":"2026-09-07T10:00:00.000000Z","created_at":"2026-09-07T10:00:00.000000Z"}

Пример

Альтернативный способ - использовать свойство $guarded для защиты конкретных полей, разрешая все остальные:

<?php namespace AppModels; use IlluminateDatabaseEloquentModel; class Post extends Model { protected $guarded = [ 'id', 'user_id', 'created_at', 'updated_at', ]; } ?>

В этом случае все поля, кроме перечисленных в $guarded, будут доступны для массового присвоения:

<?php namespace AppHttpControllers; use AppModelsPost; use AppModelsUser; use IlluminateHttpRequest; class PostController extends Controller { public function store(Request $request) { $post = Post::create([ 'title' => $request->title, 'content' => $request->content, 'user_id' => auth()->id(), 'status' => 'draft', ]); return response()->json($post); } } ?>

Результат выполнения кода:

{"id":1,"title":"My first post","content":"This is the content of the post","user_id":1,"status":"draft","created_at":"2026-09-07T10:00:00.000000Z","updated_at":"2026-09-07T10:00:00.000000Z"}

Пример

Обход исключения с помощью метода fill и последующего ручного присвоения:

<?php namespace AppHttpControllers; use AppModelsUser; use IlluminateHttpRequest; class UserController extends Controller { public function update(Request $request, $id) { $user = User::findOrFail($id); try { $user->fill($request->all()); $user->save(); } catch (MassAssignmentException $e) { // Обработка ошибки массового присвоения return response()->json([ 'error' => 'Некоторые поля не разрешены для обновления', 'message' => $e->getMessage() ], 422); } return response()->json($user); } } ?>

Результат выполнения кода при возникновении исключения:

{"error":"Некоторые поля не разрешены для обновления","message":"is_admin"}

Смотрите также

  • исключение ModelNotFoundException,
    которое выбрасывается при отсутствии модели в базе данных
  • исключение QueryException,
    которое возникает при ошибках выполнения SQL-запросов
  • исключение UniqueConstraintViolationException,
    которое выбрасывается при нарушении уникальности в базе данных
  • исключение ValidationException,
    которое возникает при ошибках валидации данных запроса
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить