36
37

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Laravel のremember_token

Last updated at Posted at 2019-12-03

Laravel のremember_token

私が Laravel プロジェクトを作成して、
システム開発を行っていたときに困ったことです。
備忘録としてまとめておこうと思います。

ユーザの削除

私が実装しようとしていたのは、ユーザの退会処理でした。
退会の確認画面で、退会する選択をしたら、

  • ユーザの持っているItemの削除
  • ユーザに関するデータの削除
  • ユーザのログアウト

の 3 つの処理が必要だと考え、以下のコードを記述しました。

UserController.php
public function destroy () {
    $user = Auth::user();

    $user->items()->delete();
    $user->delete();
    Auth::logout();

    return redirect("/");
}

これで問題なく動く・・・はずでした。

remember_token

いざ、テストを回してみると、
特定の条件でユーザが削除できないことに気付きました。

それは、
ログイン時にログイン状態を保持させることでした。

Laravel デフォルトのユーザ認証を実装すると、
ログイン状態を保持するremember_tokenがあります。

コイツが悪さをしていたのです。

ログイン状態を保持させたときの動作

色々調べてみました。
どうやら、ログイン情報を保持させると
remember_tokenが発行されて、sessionに保持されます。

そして、ログアウトの処理時に、
ユーザのremember_tokenupdate処理により更新されます。

ここまでは、「そうなのか」で済む動作ですね。

ユーザが復活!?

さて、上記のコードをテストしたと言いました。
そして、ユーザが削除できないとも言いました。
しかし、それは正しい動作の説明ではありません。

実は、しっかりとユーザの情報は削除されています。
しかし、ログアウト処理を行った際に
insert処理が行われているのです。

どうやら、
remember_tokensessionで保持したユーザが見つからなかったとき
insertするようにデフォルトで組み込まれているようです。

つまり、削除して追加していたため
結果として、削除できてないとなった訳です。

UserController.php
public function destroy () {
    $user = Auth::user();

    $user->items()->delete(); // Itemが削除される。
    $user->delete(); // ユーザが削除される。
    Auth::logout(); // ユーザが追加されてしまう。

    return redirect("/");
}

解決

まぁ、もしかしたらコードを見てすぐに
順番がおかしいことに気付いた方もいらっしゃると思います。

まだまだ素人なため、動作の順番を誤っていました。
ブラウザで動作を確認しながら記述していた際に、
ログアウト処理を忘れており、migrate:freshしたときにログイン状態が保持されていることで
ログアウト処理を追加したのが原因でした。

と、いうことで、正しいコードは以下のとおりです。

UserController.php
public function destroy () {
    $user = Auth::user();

    Auth::logout(); // ログアウト、update処理が行われる。
    $user->items()->delete(); // Itemが削除される。
    $user->delete(); // ユーザが削除される。

    return redirect("/");
}

よく考えれば、
ログアウトしてから削除が正しい順序ですよね。

正しい知識に修正して、覚えていこうと思います。

36
37
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
36
37

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?