追記(2019/08/01)
Laravel5.8からは考慮不要になりました
https://github.com/laravel/framework/pull/25952
はじめに
既存のプロダクトをLaravelに移植している際に、異なるフレームワークでのログイン状況の同期(?)でつまずいた時の話です
よくあるn番煎じの話だとは思いますのでご了承を・・・
ことのはじまり
既存フレームワークからLaravelに遷移する際、ログインユーザーの整合性をとるようにしており、ユーザーが一致しないこと(既存ではログアウトなのにLravel側ではログイン状態のまま)があるのでそのチェックをMiddlewareでしてました。
単純に一致してないからLaravel側で Auth::logout
で抜ければよかったのですが、ここで問題発生
Auth::logout
を叩くと「remember_token
フィールドが見当たりません」という例外がスローされてしまいました・・・
remember_token
自体はログイン維持機能を使うためのトークンを保管するフィールドで、Auth::logout
の時に remember_token
が必ず更新されるようです。
https://github.com/laravel/framework/blob/5.7/src/Illuminate/Auth/SessionGuard.php#L478-L534
通常ならばサクッとマイグレーションすれば解決はしますが、既存では別のやり方でログイン維持機能を実装していたので、別の方法で解決策を探してました。
解決策
大体こういうのは英語のサイトに書いてある法則
https://laravel.io/forum/05-21-2014-how-to-disable-remember-token
Userモデルでremember_token
を書き換えようとしたら、無視するだけでいいようです
/**
* remember_tokenがカラムにないテーブルでAuth::logout時に存在しないremember_tokenが更新しようとしてエラーになるので無視する
*/
public function setAttribute($key, $value)
{
if ($key !== $this->getRememberTokenName()) {
parent::setAttribute($key, $value);
}
}
おわりに
Laravel自体ドキュメントがしっかりしてたので、内部のソースとにらめっこする機会があまりなかったため、なんとなく動きが把握できたのはよかったところ
ただ、やっぱり既存の機能もLaravelに寄せていかないと同じような弊害がありそうだから考えないといけない危機感ひしひしと・・・・
Laravelを完全に理解する日は遠い・・・