Laravel shouldBeStrictで開発効率を上げよう

Model::shouldBeStrict()を使うための簡易メモ。

Model::shouldBeStrict()を設定すると何が嬉しいか?

以下の状況でエラーにしてくれます。

  1. Lazy Loading(N+1)が発生
  2. fillableにないカラムを挿入しようとした
  3. 存在しないカラムなどにアクセスしようとした

shouldBeStrict設定方法

AppServiceProviderbootメソッド内にセットするだけです。

// app/Providers/AppServiceProvider

public function boot(): void
{
    Model::shouldBeStrict();
}

引数にbool値を渡すことができるため、次のように本番環境以外でのみ適用することができます。

public function boot(): void
{
    Model::shouldBeStrict(!app()->isProduction());
}

shouldBeStrictメソッドの中身

Modelクラスを見るとshouldBeStriectが3つの処理をしていることがわかります。

// vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php

/**
 * Indicate that models should prevent lazy loading, silently discarding attributes, and accessing missing attributes.
 *
 * @param  bool  $shouldBeStrict
 * @return void
 */
public static function shouldBeStrict(bool $shouldBeStrict = true)
{
    static::preventLazyLoading($shouldBeStrict);
    static::preventSilentlyDiscardingAttributes($shouldBeStrict);
    static::preventAccessingMissingAttributes($shouldBeStrict);
}

参考ソース