- 推荐阅读
COOKIT原理
laravel 的cookie 是在头部的,我们使用的时候,一般需要在 response() 之后只用,例如
return response('ok')->withCookie('cookie_name','cookie_value');
可是很多时候我们如果不想在返回的时候设置 cookie 又改怎么办?我并没有找到一个最优的方案,可是我找到了一种解决方式。如果哪位读者有更好的办法,希望能够及时告知。谢谢
- 思路
我本来试图查找设置 cookie 的原装方法,并使用它设置 cookie 。
return response('ok')->withCookie('cookie_name','cookie_value');
追踪源码到 withCookie($cookie)
![](https://img.haomeiwen.com/i2560633/8bab22dd9add1fe2.png)
打印传递的 $cookie
参数的到结果 cookie_name
$cookie = call_user_func_array('cookie', func_get_args());
之后得到的 $cookie 是一个 cookie 对象 Symfony\Component\HttpFoundation\Cookie
![](https://img.haomeiwen.com/i2560633/e3189b785af67999.png)
由于以上结果,我不知道应该怎么直接给 cookie 赋值
因为 laravel 的 cookie 是在头部赋值的,所以,可以这样赋值 header('set-Cookie cookie_name:cookie_value');
,
但是这样有个问题是, \Cookie::get('cookie_name') 获取不到值。原因是这种方式取值,是取到的加密后的值,解密字符串 cookie_value
是没有值的,所以得到的是空。那么我们可以不解密 cookie_name ,添加到 $except 数组,再次打印,即可看到 cookie_value 这个值
![](https://img.haomeiwen.com/i2560633/7668f09aa06ea65b.png)
其实如果在设置 cookie 值的时候,如果可以直接加密, \Cookie::get('cookie_name') 就可以直接获取到值
还有一种方式是直接使用全局变量 _COOKIE['cookie_name']
还有一种方式是 \Cookie::queue(name,value,time);
这种方式可以 \Cookie::get(name) 直接取值
/** 意思是在下一个 response 返回的时候,带上这个 cookie
* Queue a cookie to send with the next response.
*
* @param array $parameters
* @return void
* @static
*/
public static function queue($parameters = null)
{
\Illuminate\Cookie\CookieJar:: ($parameters);
}
网友评论