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,
которое возникает при ошибках валидации данных запроса