@smilekabi

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

LaravelでTodoアプリ作成中Auth::user()について

解決したいこと

Laravel10とVSCodeでユーザー認証機能付きのTodoアプリを作っています。
参考にしているサイトは
https://www.hypertextcandy.com/laravel-tutorial-authentication-part-2
になります。
上記サイトはLaravelバージョンが5.7のため
その関連で発生していると思われるのですが解決法がわかりません。
どなたかご教授いただけないでしょうか。

発生している問題・エラー

フォルダ追加時に
Call to a member function folders() on null
が発生する。
WS000006.JPG
WS000005.JPG

該当するソースコード

App\Http\Controllers\FolderController.php 内で
App\Models\User.php にて定義したメソッドfolders()を
呼び出せないようです。
WS000003.JPG

App\Models\User.php 内で
foldersメソッドを記述しているのですが。。
連携がとれてないように思えます。
WS000004.JPG

自分で試したこと

3日ほどAuth::user() laravel 10 等のワードでググってみたのですが
わからずじまいでした。
覚え始めて2か月目でまだあたふたしていますが、
よりよいご回答をいただけるとありがたいです。

0 likes

2Answer

Auth::user()->folders()を分解すると次のようになります。

$user = Auth::user();
$user->folders();

Call to a member function folders() on nullというエラーメッセージからuserメソッドで取得した結果がnullで、nullに対してfoldersメソッドを呼び出そうとしている状況だと思います。

userメソッドがnullを返す状況を考えると、ログインが出来ていないのだと思います。
checkメソッドで確認したり、認証に関して確認してはいかがでしょうか?

1Like

Comments

  1. @smilekabi

    Questioner

    その通りだと思います。
    ログイン後にフォルダ作成すると何事もなく追加できるのですが
    非ログイン状態でフォルダ作成すると上記のエラーが発生する動きになっています。
    動きとしては間違っていないので勉強をすすめていこうと思いますが
    VSCode上では赤の波線が出たままなのでなんだかしっくりこないですね。
    うーん、もやもやするー!

  2. ログイン状態限定の機能であれば”ルートの保護”の項を参考に、ログインしていない状態では利用できないようにする方法もあります。

    VSCode上では赤の波線

    これに関しては、ifで判定すれば解消されると思います。

    $user = Auth:user();
    if (is_null($user)) {
        throw new Exception('非ログイン状態では利用できません');
    }
    $user->folders();
    

    もしかしたらVSCodeの拡張機能などで解決できるのかもしれませんが、これ以上の案は持ち合わせていないです・・・

  3. @smilekabi

    Questioner

    ご親切にありがとうございます。

    ログイン状態限定の機能であれば”ルートの保護”の項を参考に、ログインしていない状態では利用できないようにする方法もあります。

    はい、そのようにするつもりです。

    is_null, checkで囲ってみたのですが赤波線は消えてくれませんでした。うう。
    User.php はlaravelの標準装備したものを使っており、
    class User extends Authenticatable
    と、Authenticatableクラスを継承しています。
    artisan make:model コマンドを使って作成したモデルであれば
    class Folder extends model
    となり、この中で定義したメソッドを呼び出すと赤波線が出ないことから、
    継承の関係で赤波線の有無を判別しているのではないかと推測しております。
    Authenticatableとmodelの違いをまだ理解できていないので勉強中ではありますが。。

  4. @smilekabi

    Questioner

    もしかしたらVSCodeの拡張機能などで解決できるのかもしれませんが

    解決できそうです!
    VSCodeにphp intelephenseというプラグイン
    (PHPのコード解析や引数や戻り値を教えてくれる便利なプラグイン)
    を入れているのですが、その関係らしいです。
    https://teratail.com/questions/311480
    のページを参考にVSCodeの設定を変更したところ、赤波線が出なくなりました。
    具体的には、
    intelephense.diagnostics.undefinedClassConstants
    intelephense.diagnostics.undefinedConstants
    intelephense.diagnostics.undefinedFunctions
    intelephense.diagnostics.undefinedMethods
    intelephense.diagnostics.undefinedProperties
    intelephense.diagnostics.undefinedTypes
    のチェックを外して再起動
    になります。

    @blue32aさんのやさしさと鋭い洞察力に助けられました。
    いったん解決とさせていただきます。どうもありがとうございました!

覚え始めて2か月目
なら素直に、Laravel5.7でコーディングするか、Laravel10のチュトリアルを探してみては?

ログインしたのちいくつかフォルダやタスクを作成し、ログアウトしてもう一度ログインしてみましょう。タスク一覧ページに遷移できましたか?

因みに、参考urlはログイン認証を確認するためフォルダーを作成してます。
もう少し、短めのチュトリアルを探した方が無難です。

0Like

Comments

  1. @smilekabi

    Questioner

    そうなんですね!5.7でコーディングの発想がありませんでした。
    組むのは最新で、バージョン違いのチュートリアルを見ながら勉強したほうが
    学力つくかな?というスタンスでした。
    10のチュートリアルはいくつか探したのですが、
    Auth::user()->folders()
    の処理と同様のソースを見つけることが出来ませんでした。
    おっしゃる通り、短めのチュートリアルを探してみて
    見つからなければ5.7で作ってみようかと思います。ありがとうございました。

Your answer might help someone💌