Laravel 10 如何在所有视图中共享购物车Cookie数据?
问题原因
在ViewServiceProvider的boot方法中直接使用Cookie::get('cart')拿不到预期值,是因为此时Cookie facade还未关联当前请求的Cookie数据,它默认读取的是应用启动阶段的Cookie状态,而非当前请求携带的。而控制器中通过$request->cookie('cart')能正常获取,是因为$request是当前请求实例,已经包含了完整的请求Cookie信息。
正确实现方式
方法一:注入当前请求实例获取Cookie
修改ViewServiceProvider的boot方法,通过依赖注入获取当前请求实例,直接从请求中读取Cookie并共享给所有视图:
<?php namespace App\Providers; use Illuminate\Support\Facades\View; use Illuminate\Http\Request; use Illuminate\Support\ServiceProvider; class ViewServiceProvider extends ServiceProvider { public function boot(Request $request) { // 全局共享购物车数据到所有视图,第二个参数是默认值 View::share('cart', $request->cookie('cart', '["abcs"]')); } }
方法二:通过Request门面获取当前请求
如果不想使用依赖注入,也可以通过Request门面直接获取当前请求实例:
<?php namespace App\Providers; use Illuminate\Support\Facades\View; use Illuminate\Support\Facades\Request; use Illuminate\Support\ServiceProvider; class ViewServiceProvider extends ServiceProvider { public function boot() { $cart = Request::cookie('cart', '["abcs"]'); View::share('cart', $cart); } }
验证注意事项
- 确保
ViewServiceProvider已经在config/app.php的providers数组中注册 - 测试时可清除浏览器缓存或使用无痕模式,避免旧Cookie干扰结果
- Laravel会自动解密加密存储的Cookie,
$request->cookie()获取到的是解密后的原始数据,无需额外处理
内容的提问来源于stack exchange,提问作者Sven van den Boogaart
相关产品推荐
相关产品推荐

