2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

どっちを使う!?「Auth::user()->id」と「Auth::id()」の使い分け

Posted at

はじめに

GPT4にコードレビューをしてもらっていたところ、タイトルのような指摘を受けたので、少しいろいろと調べてみました。

問題

訂正を勧められた箇所(〇〇.blade.php)
@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()->を使用したいと思います。

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?