Laravel開発時にしておくと良い設定を紹介します!
Model::shouldBeStrict()
結論、AppServiceProvider
に下記のように記述しましょう!
// 略
public function boot()
{
Model::shouldBeStrict(! $this->app->isProduction());
}
// * Laravel 9.35で追加されたメソッドです
// こうすることで開発環境でのみこの設定を有効にすることができます
Model::shouldBeStrict()
を追記すると以下のようなメリットがあります。
- N+1問題が起きているとエラーで教えてくれる
- fillableに登録していない項目を投入しようとするとエラーで教えてくれる
- Eloquentモデルで存在しないプロパティやselectしていない項目にアクセスするとエラーで教えてくれる
Model::shouldBeStrict()
の中身はこうなっています。
/**
* 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);
}
先程メリットで挙げた項目を実現してくれているメソッドがそれぞれ呼ばれていることが分かります。
もし3つもいらなくてどれかを抜粋して利用したい場合はこのshouldBeStrict
は使えませんが、その場合はAppServiceProvider.php
に個別で設定してあげれば実現できます。
あくまでshouldBeStrict
はまとめて呼び出してくれてるだけなので!
せっかくなのでshouldBeStrict
で呼び出されているメソッドも簡単に見ていきましょう。
preventLazyLoading
preventLazyLoading
メソッドの中身は以下のようになっています。
public static function preventLazyLoading($value = true)
{
static::$modelsShouldPreventLazyLoading = $value;
}
// Laravel 8.43.0で追加されたメソッドです
$modelsShouldPreventLazyLoading
プロパティをtrueにしているようです。
このメソッドは、N+1問題が起きているとエラーで教えてくれます。
今まではlaravel debugbarをインストールしてクエリの発行回数を見て問題がないか確認していましたが、エラーで教えてくれるのはとても便利ですね!
これを個別で設定した場合下記のように追記してください!
// 略
public function boot()
{
Model::preventLazyLoading(! $this->app->isProduction());
}
preventSilentlyDiscardingAttributes
preventSilentlyDiscardingAttributes
メソッドの中身は以下のようになっています。
public static function preventSilentlyDiscardingAttributes($value = true)
{
static::$modelsShouldPreventSilentlyDiscardingAttributes = $value;
}
// Laravel 9.28で追加されたメソッドです
$modelsShouldPreventSilentlyDiscardingAttributes
プロパティをtrueにしているようです。
このメソッドは、fillableに登録していない項目を投入しようとするとエラーで教えてくれます。
個人的にはこの3つの中で一番嬉しい機能です。
過去に、ちゃんとプロパティを指定して保存できているはずなのにDBを確認するとなぜか保存されていない、という現象に出くわしました。原因はfillable設定で抜けていたというケアレスミスでした。(1回ではなく何回かあり、数十分無駄にしました)
同じミスをしたことがある方もいるのではないでしょうか。
このようなミスをエラーで教えてくれるのはとても便利で効率が上がりますね!
これを個別で設定した場合下記のように追記してください!
// 略
public function boot()
{
Model::preventSilentlyDiscardingAttributes(! $this->app->isProduction());
}
preventAccessingMissingAttributes
preventAccessingMissingAttributes
メソッドの中身は以下のようになっています。
public static function preventAccessingMissingAttributes($value = true)
{
static::$modelsShouldPreventAccessingMissingAttributes = $value;
}
// Laravel 9.35で追加されたメソッドです
$modelsShouldPreventAccessingMissingAttributes
プロパティをtrueにしているようです。
このメソッドは、Eloquentモデルで存在しないプロパティやselectしていない項目にアクセスするとエラーで教えてくれます。
$user = User::first();
// 設定無効の場合
$user->nama //nameをタイポしているがエラーにならずnullになる
上記のように今までだとタイポしていてもエラーにならずnullが返ってきます。設定を有効にしているとタイポした時点でエラーで教えてくれるのでバグを未然に防ぐことが出来そうですね!
以上がLaravel開発時にしておくと良い初期設定でした。よかったら使ってみてください!
ご指摘などがあればコメントで教えていただけたらと思います。