Post 모델의 $fillable 에 title 만 지정되어 있는 상태에서
class Post extends Model { use HasFactory; protected $fillable = ['title']; public function user(): BelongsTo { return $this->belongsTo(User::class); } }
아래와 같이 대량 할당으로 Post 모델을 생성하면 어떻게 될까요?
Post::create([ 'user_id' => 1, 'title' => 'some title', 'content' => 'some content' ]);
$fillable에 지정하지 않은 속성들을 누락한 채 생성을 시도합니다.
위 이미지에서 에러는 DB에서 user_id 항목에 NULL 값을 허용하지 않아서 발생했는데요. NULL을 허용했다면 1을 저장하려고 했던 의도와 달리 NULL로 저장되었을 겁니다.
엘로퀀트 스트릭트 모드를 활성화 하면 이런 의도치 않은 누락을 개발 단계에서 발견할 수 있습니다. AppServiceProvider::boot() 메서드 안에서 Model::shouldBeStrict() 메서드를 호출하면 됩니다.
// app/Providers/AppServiceProvider.php public function boot() { Model::shouldBeStrict(); //Model::preventLazyLoading(); }
다시 시도해보면 MassAssignmentException이 나는 걸 확인할 수 있습니다.
또는 shouldBeStrict() 대신 shouldBeStrict() 메서드 내부에서 호출되는 Model::preventSilentlyDiscardingAttributes() 메서드를 직접 호출해주어도 됩니다.
관련 메뉴얼 위치
영문: https://laravel.com/docs/9.x/eloquent#configuring-eloquent-strictness
한글: https://laravel.kr/docs/9.x/eloquent#configuring-eloquent-strictness