라라쇼츠

대량 할당시 속성 누락 원천 차단

엘로퀀트 스트릭트 모드를 이용하여 대량 할당 시 속성 누락을 원천 차단하는 방법을 알아봅니다. #php #laravel #laravel9 #developer #development #opentutorials #오픈튜토리얼스 #라라벨 #shorts

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

댓글

댓글 본문