Laravel 8中Cookie::make无法保存Cookie及withCookie方法报错问题排查
核心错误点
- 第一版代码未将创建的Cookie附加到最终返回的响应对象:Laravel中所有Cookie都需要绑定到返回给客户端的响应实例上才会被发送到浏览器,仅调用
Cookie::make()不会触发Cookie下发,浏览器未收到Cookie自然不会存储,下次访问无法读取。 - 第二版代码存在两个错误:
- 引用了错误的Response类:
Illuminate\Support\Facades\Response是门面类,不是实际的响应实例类,调用不存在的实例方法会报错,需要改为引用Illuminate\Http\Response。 - Cookie绑定对象与最终返回的响应不一致:
withCookie()调用在自定义的Response实例上,但最终返回的是view()生成的响应实例,Cookie并没有绑定到实际下发的响应上,同样无法生效。
- 引用了错误的Response类:
- 配置修改后未清理缓存:修改
config/session.php后如果之前生成过配置缓存,需要清理缓存才会生效。
正确实现代码
use Illuminate\Support\Facades\Cookie; class TestController extends Controller { public function show($page) { echo @Cookie::get('testcookie'); if (Cookie::get('testcookie')) { echo 'cookie exists<br>'; } else { echo 'cookie does not exist<br>'; } // 将Cookie绑定到最终返回的视图响应上 return response() ->view('tests.'.$page, ['page' => $page]) ->cookie('testcookie', '5', 120); } }
额外注意事项
- 修改配置文件后执行
php artisan config:clear清理配置缓存即可生效,本地开发环境不建议执行php artisan config:cache,避免配置修改后不生效的问题。 - 如果需要读取原生PHP设置的Cookie,或者不需要Laravel默认的Cookie加密功能,可以将Cookie名添加到
app/Http/Middleware/EncryptCookies.php的$except属性数组中,跳过加密处理。
内容的提问来源于stack exchange,提问作者Paul Godard
相关产品推荐
相关产品推荐

