【发布时间】:2018-09-24 16:14:25
【问题描述】:
我在会话中保留了不同的东西,我在用户登录和注销时都使用它们。问题是当用户注销时,laravel 会清除我在会话中存储的所有内容:
这是因为 laravel 核心类 AuthenticatesUsers 看起来像这样:
/**
* Log the user out of the application.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function logout(Request $request)
{
$this->guard()->logout();
$request->session()->invalidate();
return redirect('/');
}
因为我不想更改核心类,如何避免在用户注销时丢失会话数据?
【问题讨论】:
-
你不能。这是会话的基本原则。
-
会话是一种存储信息(以变量形式)以在多个页面中使用的方式。用户是否登录只是可能存储在会话中的一条信息。仅仅因为用户退出就刷新整个会话没有任何意义。
-
@user1985273 实际上,注销后清除会话是有意义的。因为该数据与登录状态相关联(相关),一旦您注销,您通常需要一个“干净的状态”。例如,如果我登录到网上商店并在购物车中添加了一些东西,我希望当我注销时我的购物车会被清除,因为如果其他人在同一台机器上使用另一个帐户登录,他们应该在我退出之前无法看到我的购物车内容。如果您想为已登录的用户保留数据,您应该使用另一个持久层。
-
@Bogdan 这只是将登录用户数据保留在会话中的一个示例。但正如我所说,会话是一种跨多个请求存储信息的方法。该数据可能与登录的用户相关,也可能不相关。例如,如果我有一个多语言网站,我可能希望保留用户在会话中选择的语言,因此如果用户注销,网站仍将保留用户的语言之前选择的。所以在注销时清除所有会话数据对我来说仍然没有任何意义。
-
@Bogdan 为了获得一个“干净的状态”,我宁愿将所有登录的用户数据保存在我想在注销时清理的某个会话变量中。例如 $_SESSION['user']['cart']、$_SESSION['user']['whatever'] 并在注销时清除 $_SESSION['user']。这样你就可以得到“白板”并保留像 $_SESSION['selected_language'] 这样的数据
标签: php laravel laravel-5.4