エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

【Laravel】Eloquentでsaveを書くときに注意すべきこと(特に関数内で)【677日目】

Eloquent使って、saveがしたい!

function saveName(\App\Models\User $user)
{
    $user->name = "ringo";
    return $user->save();
}

このコード、怖い!!!
なぜか?

もし、$userにすでに別な値がセットされてたら?

public updateUser()
{
    $user = User::find(1);
    $user->age = 18;

    $this->saveName($user);
}

もしこんなコードだったら?

saveNameって関数で、 nameageの両方を保存してしまう。
このときの$userのsaveは、nameをringoにして、かつageを18にするコードになる。
意図しない動作になってしまう。

なんでだめだった?($userにセットされた値を全て保存)

saveというのは、『$userにセットされた値を全て保存』という認識のほうが近く、
saveNameの影響する範囲が、見た目よりずっと広いこと。

saveNameって書いているけど、実は『$userのnameのセット』と『$userにセットされた値を全て保存』の両方に責務がある

ではどうするか(関数の分け方)

setName(あるいはsetParam)とsaveで分けるべきでしたφ(・

テストコード書ける人は、ちょっとテストコードイメージすると、値が正しく保存しているかと、
セットされた値が保存できたかの2つに分かれるのがイメージできると思いますφ(・