140
124

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravel 開発時にしておくと良い初期設定

Last updated at Posted at 2023-02-27

Laravel開発時にしておくと良い設定を紹介します!

Model::shouldBeStrict()

結論、AppServiceProviderに下記のように記述しましょう!

AppServiceProvider.php
// 略

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

// * Laravel 9.35で追加されたメソッドです
// こうすることで開発環境でのみこの設定を有効にすることができます

Model::shouldBeStrict()を追記すると以下のようなメリットがあります。

  1. N+1問題が起きているとエラーで教えてくれる
  2. fillableに登録していない項目を投入しようとするとエラーで教えてくれる
  3. Eloquentモデルで存在しないプロパティやselectしていない項目にアクセスするとエラーで教えてくれる

Model::shouldBeStrict()の中身はこうなっています。

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);
}

先程メリットで挙げた項目を実現してくれているメソッドがそれぞれ呼ばれていることが分かります。

もし3つもいらなくてどれかを抜粋して利用したい場合はこのshouldBeStrictは使えませんが、その場合はAppServiceProvider.phpに個別で設定してあげれば実現できます。
あくまでshouldBeStrictはまとめて呼び出してくれてるだけなので!

せっかくなのでshouldBeStrictで呼び出されているメソッドも簡単に見ていきましょう。

preventLazyLoading

preventLazyLoadingメソッドの中身は以下のようになっています。

Model.php
public static function preventLazyLoading($value = true)
{
    static::$modelsShouldPreventLazyLoading = $value;
}

// Laravel 8.43.0で追加されたメソッドです

$modelsShouldPreventLazyLoadingプロパティをtrueにしているようです。
このメソッドは、N+1問題が起きているとエラーで教えてくれます。
今まではlaravel debugbarをインストールしてクエリの発行回数を見て問題がないか確認していましたが、エラーで教えてくれるのはとても便利ですね!

これを個別で設定した場合下記のように追記してください!

AppServiceProvider.php
// 略

public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

preventSilentlyDiscardingAttributes

preventSilentlyDiscardingAttributesメソッドの中身は以下のようになっています。

Model.php
public static function preventSilentlyDiscardingAttributes($value = true)
{
    static::$modelsShouldPreventSilentlyDiscardingAttributes = $value;
}

// Laravel 9.28で追加されたメソッドです

$modelsShouldPreventSilentlyDiscardingAttributesプロパティをtrueにしているようです。
このメソッドは、fillableに登録していない項目を投入しようとするとエラーで教えてくれます。
個人的にはこの3つの中で一番嬉しい機能です。
過去に、ちゃんとプロパティを指定して保存できているはずなのにDBを確認するとなぜか保存されていない、という現象に出くわしました。原因はfillable設定で抜けていたというケアレスミスでした。(1回ではなく何回かあり、数十分無駄にしました)
同じミスをしたことがある方もいるのではないでしょうか。
このようなミスをエラーで教えてくれるのはとても便利で効率が上がりますね!

これを個別で設定した場合下記のように追記してください!

AppServiceProvider.php
// 略

public function boot()
{
    Model::preventSilentlyDiscardingAttributes(! $this->app->isProduction());
}

preventAccessingMissingAttributes

preventAccessingMissingAttributesメソッドの中身は以下のようになっています。

Model.php
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開発時にしておくと良い初期設定でした。よかったら使ってみてください!

ご指摘などがあればコメントで教えていただけたらと思います。

140
124
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
140
124

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?