はじめに
GPT4にコードレビューをしてもらっていたところ、タイトルのような指摘を受けたので、少しいろいろと調べてみました。
問題
@section('content')
@if (Auth::user()->id == $user->id)
// 中略(自分のプロフィールを表示する処理)
@endif
@endsection
自分のプロフィールを表示する前に、ログインしているユーザとアクセスしようとしているユーザが同じか認証しようとしていたところです。
解決策
@section('content')
@if(Auth::id() == $user->id)
// 中略(自分のプロフィールを表示する処理)
@endif
@endsection
単体でみると微々たる差かもしれませんが、他人が読むコードとなると、少しでもシンプルな方が良いとは思います。
そして実質的な意味は同じでも、未ログイン時にアクセスを試みると、挙動が異なります。
Auth::user()->idの場合
Auth::user()はログインしているユーザのインスタンスを返すので、未ログイン時にはnullを返します。
そのため未ログイン時の場合は、nullオブジェクトからidプロパティを取得しようとすることになるので、エラーが発生します。
Error: Trying to get property 'id' of non-object
これはアプリケーションが予期せぬ状態でクラッシュする原因となります。
Auth::id()の場合
対してAuth::id()は未ログイン時にnullを返す点では同じですが、こちらは直接ログインユーザのidを返します。
ログイン時はログインユーザのidを、未ログイン時はnullを返すだけなので、エラーが起こる心配はありません。(nullの場合の処理を行う必要性はあります)
そのため、単にユーザのidを取得したいというケースであれば、Auth::id()の方が適切だと考えられます。
それではいつ「Auth::user()->」を使うのか
Auth::user()->は完全なモデルインスタンスを返すので、id以外の他の属性(年齢や職業など)に同時にアクセスしたいときに便利です。
$user = Auth::user();
if ($user) {
age = $user->age;
occupation = $user->occupation;
// 他の情報にもアクセスする時
}
まとめ
idのみを取得したいときにはAuth::id()を、他の情報も取得したいときにはAuth::user()->を使用したいと思います。