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

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

## Model::shouldBeStrict()
結論、`AppServiceProvider`に下記のように記述しましょう！
```php: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()`の中身はこうなっています。
```php: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`メソッドの中身は以下のようになっています。
```php:Model.php
public static function preventLazyLoading($value = true)
{
    static::$modelsShouldPreventLazyLoading = $value;
}

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

これを個別で設定した場合下記のように追記してください！
```php:AppServiceProvider.php
// 略

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

## preventSilentlyDiscardingAttributes
`preventSilentlyDiscardingAttributes`メソッドの中身は以下のようになっています。
```php:Model.php
public static function preventSilentlyDiscardingAttributes($value = true)
{
    static::$modelsShouldPreventSilentlyDiscardingAttributes = $value;
}

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

これを個別で設定した場合下記のように追記してください！
```php:AppServiceProvider.php
// 略

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

## preventAccessingMissingAttributes
`preventAccessingMissingAttributes`メソッドの中身は以下のようになっています。
```php:Model.php
public static function preventAccessingMissingAttributes($value = true)
{
    static::$modelsShouldPreventAccessingMissingAttributes = $value;
}

// Laravel 9.35で追加されたメソッドです
```
`$modelsShouldPreventAccessingMissingAttributes`プロパティをtrueにしているようです。
このメソッドは、Eloquentモデルで存在しないプロパティやselectしていない項目にアクセスするとエラーで教えてくれます。
```php
$user = User::first();

// 設定無効の場合
$user->nama //nameをタイポしているがエラーにならずnullになる
```
上記のように今までだとタイポしていてもエラーにならずnullが返ってきます。設定を有効にしているとタイポした時点でエラーで教えてくれるのでバグを未然に防ぐことが出来そうですね！

以上がLaravel開発時にしておくと良い初期設定でした。よかったら使ってみてください！

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