为什么cookie不在Laravel Lumen中设置?


Why cookie isn't set in Laravel Lumen

这个问题是这个问题的后续。

我的视图中有一条消息说:This site uses cookie [...] Close .

当用户单击Close时,向控制器发送ajax请求。函数如下:

public function acceptCookie(Request $request)
{
    if ($request->valid == 'accept') {
        $response = new Response('acceptCookie');
        if ($response->withCookie(cookie('acceptCookie', 'accepte', 44000))) {
            return Response()->json(array('statut' => 'Succes'));    
        } else {
            return Response()->json(array('statut' => 'Erreur'));
        }            
    } else {
        return Response()->json(array('statut' => 'Erreur'));
    }
}

我没有任何错误,JSON总是返回{"statut":"Succes"}

为什么饼干不是设置?

根据Lumen文档,似乎需要为响应(例如示例中的响应)将cookie排队。文档是这样说的:

为下一个响应排队

如果您想在创建响应之前设置cookie,使用Cookie::queue()方法。cookie将被自动删除附加到您的应用程序的最终响应。

Cookie::queue($name, $value, $minutes);

我的建议是尝试用排队cookie代替withCookie。但是,您可能需要稍微重写函数以适应,因为它看起来好像您正在尝试从一个请求发送响应。

希望这对你有用!

基于Illuminate'Http'ResponseTrait28, Illuminate'Http'Response::withCookie方法返回$this

/**
 * Add a cookie to the response.
 *
 * @param  'Symfony'Component'HttpFoundation'Cookie  $cookie
 * @return $this
 */
public function withCookie(Cookie $cookie)
{
    $this->headers->setCookie($cookie);
    return $this;
}

表示你的代码中有逻辑错误。

// This always return Illuminate'Http'Response instance,
// thus it will never reach ELSE statement forever.
if ($response->withCookie(cookie('acceptCookie', 'accepte', 44000))) {
     return Response()->json(array('statut' => 'Succes'));    
} else {
    return Response()->json(array('statut' => 'Erreur'));
}