如何在Laravel Blade文件中设置cookie



我想在laravel-blade.php文件中设置cookie,而不是在控制器中。我该如何设置?

免责声明:我将把我的答案集中在PHP和laravel上。

为什么不在控制器中设置

知道为什么你不能/或不想在控制器中使用laravel的cookie Facade设置cookie真的很有帮助,例如Cookie::queue,因为这很容易做到!

从这个来源来看,有两种方法。

通过响应:return response(view('welcome'))->cookie('name','value',$min);

通过队列:Cookie::queue(Cookie::make('name','value',$min)); return view('welcome');


设置Cookie是响应标头,而不是正文

假设您在PHP中设置这些cookie,它们需要作为响应头的一部分,而不是主体(视图(的一部分。这就是为什么你需要在控制器中设置这些,在那里你会发送一个响应!

如果你试图使用PHP函数来设置cookie,你会遇到错误"报头已经被发送";

根据文档:https://www.php.net/setcookie

setcookie((定义了一个cookie,该cookie将与其他HTTP头一起发送。与其他标头一样,cookie必须在脚本的任何输出之前发送(这是一个协议限制(。这需要在任何输出之前调用此函数,包括和标记以及任何空格。

要理解这意味着什么,了解请求响应的结构很有帮助:

请求响应标头组成,可能是正文

  • 注意:您可以在浏览器开发工具的网络选项卡中看到这些

请求头类似于请求的元数据,可以告诉服务器请求的内容类型以及请求者。

响应标头类似于返回的响应的元数据,可以告诉服务器要传递的内容类型、缓存多长时间以及设置的相关cookie。

示例请求标头:

  • Content-Type: 'application/json'
  • Content-Type: 'application/pdf'
  • Content-Type: 'text/html'
  • Content-Type: 'text/css'
  • User-Agent: 'Mozilla/5.0 (<system-information>) <platform> (<platform-details>) <extensions>'
  • Authorization: 'Bearer <token>'

示例响应标头:

  • Content-Type,因为它可能与请求的内容不同
  • Expires: 'Wed, 07 Sep 2022 19:26:49 GMT'
  • Cross-Origin-Resource-Policy: 'cross-origin'
  • Date: 'Wed, 07 Sep 2022 19:26:49 GMT'
  • CCD_ 14
  • Set-Cookie: test_cookie=CheckForPermission; expires=Wed, 07-Sep-2022 19:41:49 GMT; path=/; domain=.doubleclick.net; Secure; HttpOnly; SameSite=none

值得注意的是:-Set-Cookie-告诉浏览器将这些cookie添加到应用程序存储(您可以在开发工具的应用程序/存储选项卡中查看这些cookie(

响应标头可以具有Set-Cookie,而不是请求标头。这是有道理的,因为通常cookie信息将来自";回答";(响应(;问题";(请求(通过执行一些逻辑,例如,该用户已通过身份验证,这里有一个cookie来保持他们的会话。


此外:安全&仅HTTP Cookie

Cookie可以通过几个选项进行设置——仅限安全和仅限http。这意味着cookie必须在安全连接(https(上设置,并且http只能来自响应,不能被JavaScript调整(客户端(覆盖

Laravel的Cookie选项示例:队列外观:

// $name, $value, $minutes = 0, $path = null, $domain = null, $secure = false, $httpOnly = true
Cookie::queue($name, $value, $ttl, $path, $domain, $secure, $httpOnly);

ttl=";"活下去的时间";或到期前的时间,例如2分钟

最新更新