身份验证系统仅使用会话作为存储来跨请求保持身份验证状态。但是,Laravel 的身份验证系统不负责处理所有您的会话数据,它只关心存储身份验证相关信息,例如用户详细信息。如果您想为经过身份验证的用户处理额外的会话数据,则需要手动完成。
逻辑很简单:
如果用户执行某些操作,例如向购物车添加东西,则数据会保留在那里,因为会话通过 cookie 绑定到发出请求的浏览器。
如果用户从同一浏览器登录,Laravel 的身份验证系统会检查凭据,如果它们正确,它会将有关该用户的必要信息存储在同一会话中。先前存储的有关购物车的数据仍然存在且未触及,因此您可以在登录用户的上下文中使用它。如果此时您想要保留会话购物车,以便用户将来访问他/她的帐户时可以使用它,那么您需要将详细信息存储在数据库中。下面是几个步骤,展示了实现这一目标的方法:
1. 创建一个事件监听器,我们将其命名为SyncShoppingCart,它将监听Illuminate\Auth\Events\Login 事件(命令\\ 中的双反斜杠用于转义单个斜杠):
php artisan make:listener SyncShoppingCart --event=Illuminate\\Auth\\Events\\Login
2. 上一条命令在app/Listeners 中创建了一个名为SyncShoppingCart.php 的文件。现在您只需要将购物车数据存储在该类的handle 方法中的用户中。下面的示例假设您有一个 cart_item 表来存储有关添加到购物车的项目的信息,并且您有一个为它定义的 CartItem 模型。此示例已简化,您需要对其进行修改以满足您的需要,但这是理解此方法的一个很好的起点:
public function handle(Login $event)
{
// Iterate over the session cart items and
foreach (session()->get('cart') as $item) {
$cartItem = new App\CartItem();
// Set the user ID for the cart item so you know
// which user added this item to the cart
$cartItem->user_id = Auth::id();
// Set the product ID and any other properties
// you want stored for the cart item
$cartItem = $item->product_id;
// ...
// Save the cart item to the database
$cartItem->save();
}
session()->forget('cart');
}
3.然后在$listen数组中的app/Providers/EventServiceProvider.php中注册偶数监听器:
protected $listen = [
...
'Illuminate\Auth\Events\Login' => [
'App\Listeners\SyncShoppingCart',
],
];
现在,每当用户登录时,都会调用App\Listeners\SyncShoppingCart::handle 方法并将会话购物车中的项目添加到数据库中。当然,在用户登录后,您还应该存储添加到数据库中的新项目,单独的会话应该用于存储客人的购物车信息。注销时,您可以从会话中删除购物车并完成它,因为您知道购物车内容存储在数据库中,并且可以在用户下次登录时检索。
你可以在 Laravel 文档中阅读更多关于 Authentication Events、Sessions 和 Events 的信息。