Laravel のremember_token
私が Laravel プロジェクトを作成して、
システム開発を行っていたときに困ったことです。
備忘録としてまとめておこうと思います。
ユーザの削除
私が実装しようとしていたのは、ユーザの退会処理でした。
退会の確認画面で、退会する選択をしたら、
- ユーザの持っている
Item
の削除 - ユーザに関するデータの削除
- ユーザのログアウト
の 3 つの処理が必要だと考え、以下のコードを記述しました。
public function destroy () {
$user = Auth::user();
$user->items()->delete();
$user->delete();
Auth::logout();
return redirect("/");
}
これで問題なく動く・・・はずでした。
remember_token
いざ、テストを回してみると、
特定の条件でユーザが削除できないことに気付きました。
それは、
ログイン時にログイン状態を保持させることでした。
Laravel デフォルトのユーザ認証を実装すると、
ログイン状態を保持するremember_token
があります。
コイツが悪さをしていたのです。
ログイン状態を保持させたときの動作
色々調べてみました。
どうやら、ログイン情報を保持させると
remember_token
が発行されて、session
に保持されます。
そして、ログアウトの処理時に、
ユーザのremember_token
がupdate
処理により更新されます。
ここまでは、「そうなのか」で済む動作ですね。
ユーザが復活!?
さて、上記のコードをテストしたと言いました。
そして、ユーザが削除できないとも言いました。
しかし、それは正しい動作の説明ではありません。
実は、しっかりとユーザの情報は削除されています。
しかし、ログアウト処理を行った際に
insert
処理が行われているのです。
どうやら、
remember_token
をsession
で保持したユーザが見つからなかったとき
insert
するようにデフォルトで組み込まれているようです。
つまり、削除して追加していたため
結果として、削除できてないとなった訳です。
public function destroy () {
$user = Auth::user();
$user->items()->delete(); // Itemが削除される。
$user->delete(); // ユーザが削除される。
Auth::logout(); // ユーザが追加されてしまう。
return redirect("/");
}
解決
まぁ、もしかしたらコードを見てすぐに
順番がおかしいことに気付いた方もいらっしゃると思います。
まだまだ素人なため、動作の順番を誤っていました。
ブラウザで動作を確認しながら記述していた際に、
ログアウト処理を忘れており、migrate:fresh
したときにログイン状態が保持されていることで
ログアウト処理を追加したのが原因でした。
と、いうことで、正しいコードは以下のとおりです。
public function destroy () {
$user = Auth::user();
Auth::logout(); // ログアウト、update処理が行われる。
$user->items()->delete(); // Itemが削除される。
$user->delete(); // ユーザが削除される。
return redirect("/");
}
よく考えれば、
ログアウトしてから削除が正しい順序ですよね。
正しい知識に修正して、覚えていこうと思います。