【问题标题】:Why cookie isn't set in Laravel Lumen为什么 cookie 没有在 Laravel Lumen 中设置
【发布时间】:2015-08-13 21:26:06
【问题描述】:

这个问题是this question的以下问题。

我认为我有一条消息说: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"}

为什么没有设置 cookie?

【问题讨论】:

  • 你试过$response->withCookie(cookie()->forever('name', 'value'));吗?
  • 有什么想法吗?仍然卡住同样的问题
  • 您是否在 app.php 中启用了 Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class?

标签: php laravel cookies lumen


【解决方案1】:

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

为下一个响应排队 Cookie

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

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

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

希望这对你有用!

【讨论】:

  • zien:我还想说,在某些情况下,我最终只使用了 PHP 的 setcookie 和 $_COOKIE,而不是尝试使用 Lumen 的东西。当所有其他方法都失败时,它仍然是 PHP。 :)
  • 回到这个问题,因为这个问题没有解决。我需要它。 Lumen 看不到 PHP Cookie(例如 var_dump($_COOKIE))。 如何使用 Lumen 设置 cookie?为什么这么难?
  • 无论如何,您应该仍然可以访问 $_COOKIE。如果没有设置 cookie,您应该会看到一个带有 var_dump($_COOKIE) 的空数组。 ...您从 var_dump 得到什么输出?
  • 非常非常奇怪。我在其上定义 cookie 的路由页面一直返回该 cookie。但是,在其他视图中,var_dump($_COOKIE) 会生成错误undefined ...。在 Chrome 中,我有插件 cookieManager,他还看到了 cookie ...
【解决方案2】:

基于Illuminate\Http\ResponseTrait28Illuminate\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'));
}

【讨论】:

    猜你喜欢
    • 2015-08-13
    • 2020-12-05
    • 2011-10-21
    • 2021-05-01
    • 2012-02-21
    • 2021-06-30
    相关资源
    最近更新 更多