Las*_*eak 5 php laravel laravel-5
现在,一旦用户登录或注册,我的 Web 应用程序的匿名(未经身份验证)用户的会话数据就不会移动/分配给用户。
例如:一个匿名用户与应用程序交互,创建一些会话数据(比如购物车中的产品),然后登录/注册然后注销,会话数据仍然可以访问并且不会移动/现在无法访问未经身份验证的用户。
我正在使用文件会话驱动程序(没有数据库),也许有人可以提供一些需要更改的示例(我假设在会话配置中),以便将匿名用户创建的任何会话数据分配给并且只能通过此访问用户一旦通过登录或注册进行身份验证,并且仅在用户通过身份验证时。
这样做的要求是因为应用程序的用户创建了唯一的对象(与他们的 user_id 相关联),这些对象仅在订单处理运行时付款后才保留。我将它们存储在会话中,直到用户登录/注册并完成最后的订购步骤,然后才会保留它们。因此,在用户注销后,我绝对不能在未经身份验证的会话中保留用户特定的对象。我可以在注销时刷新会话,但理想情况下我希望在用户重新登录时保留它们。
身份验证系统仅使用会话作为存储来跨请求保留身份验证状态。然而,Laravel 的身份验证系统不负责处理所有会话数据,它只关心存储身份验证相关信息,例如用户详细信息。如果您想处理经过身份验证的用户的其他会话数据,则需要手动执行此操作。
逻辑很简单:
如果用户执行某些操作(例如向购物车添加商品),则数据会保留在那里,因为会话通过 cookie 绑定到发出请求的浏览器。
如果用户从同一浏览器登录,Laravel 的身份验证系统会检查凭据,如果它们正确,则会在同一会话中存储有关该用户的必要信息。之前存储的有关购物车的数据仍然存在且未受影响,因此您可以在登录用户的上下文中使用它。如果此时您想要保留会话购物车,以便用户将来访问他/她的帐户时可以使用它,那么您需要将详细信息存储在数据库中。以下是展示实现这一目标的方法的几个步骤:
1.创建一个事件监听器,我们将其命名为SyncShoppingCart,它将监听Illuminate\Auth\Events\Login事件(命令中\\需要使用双反斜杠来转义单斜杠):
php artisan make:listener SyncShoppingCart --event=Illuminate\\Auth\\Events\\Login
Run Code Online (Sandbox Code Playgroud)
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');
}
Run Code Online (Sandbox Code Playgroud)
3.app/Providers/EventServiceProvider.php然后在数组中注册偶数监听器$listen:
protected $listen = [
...
'Illuminate\Auth\Events\Login' => [
'App\Listeners\SyncShoppingCart',
],
];
Run Code Online (Sandbox Code Playgroud)
现在,每当用户登录时,App\Listeners\SyncShoppingCart::handle都会调用该方法并将会话购物车中的商品添加到数据库中。当然,在用户登录后,您也应该将添加的新商品存储在数据库中,仅应使用会话来存储仅供客人使用的购物车信息。注销时,您可以从会话中删除购物车并完成操作,因为您知道购物车内容存储在数据库中,并且可以在用户下次登录时检索。
您可以在 Laravel 文档中阅读有关Authentication Events、Sessions和Events的更多信息。