【问题标题】:Symfony2 Cookies not being set in controllerSymfony2 Cookies 未在控制器中设置
【发布时间】:2014-05-07 06:15:30
【问题描述】:

我似乎无法从我的控制器获取 cookie。

代码:

/**
     * @Route("", name="wx_exchange_default_index")
     * @Template("WXExchangeBundle:Default:index.html.twig")
     * @Method({"GET"})
     */
    public function indexAction(Request $request)
    {
        $returnArray['parents'] = self::getCategories();
        $cookieLocationSession = $request->cookies->get('locationidsession', 0);
        $cookieLocation = $request->cookies->get('locationid', 0);
        $securityContext = $this->container->get('security.context');
        $hashids = $this->get("wxexchange_hashids_service");

        if ($securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED'))
        {
            $user = $securityContext->getToken()->getUser();
            $returnArray['user'] = $user;
            $location = $user->getTblProfile()->getTblLocation();

            if(!$cookieLocation || $cookieLocation != $hashids->encrypt($location->getId()))
            {
                $cookieLocation = $hashids->encrypt($location->getId());

                //TODO: cookies are not being set figure out whys
                $response = new Response();
                $response->headers->setCookie(new Cookie("locationid", $cookieLocation, 365, '/', null, false, false));
                $response->sendHeaders();
            }
        }

        if (!$cookieLocation && !$cookieLocationSession)
        {
            return $returnArray;
        }

        if ($cookieLocationSession)
        {
            $cookieLocation = $cookieLocationSession;
        }

        if (!isset($location) || $cookieLocationSession)
        {
            $locationService = $this->get("wxexchange_location_service");
            $locationId = $hashids->decrypt($cookieLocation);
            if(count($locationId) >= 1)
                $location = $locationService->getLocationById($locationId[0]);
        }

        if(isset($location))
            return $this->redirect($this->generateUrl('wx_exchange_location', array('slug' => $location->getSlug(), 'locationid' => $cookieLocation)));


        return $returnArray;
    }

我必须返回响应吗?如果我这样做了,我该如何继续处理(我的代码中有一个重定向)?

编辑:有趣的是,如果已经设置了相同的 cookie(通过 JQuery),运行上面的代码会删除它,但不会设置它。

编辑:已发布操作代码。

【问题讨论】:

  • 您能出示您的 redirect 代码吗?

标签: php symfony cookies


【解决方案1】:

cookie 对象的 httpOnly 默认设置为 true,http://api.symfony.com/2.0/Symfony/Component/HttpFoundation/Cookie.html

这意味着浏览器不应使 cookie 对客户端脚本可见。如果您需要在脚本中查看 cookie,您可以在创建 cookie 时将第 7 个参数作为 false 传递。

$response->headers->setCookie(new Cookie('foo', 'bar',time() + 60, '/', null, false, false));

如果您只需要查看 cookie 以进行调试,您可以使用 Chrome 开发工具。它们位于“资源”标签下。

编辑:试试$response->sendHeaders();

【讨论】:

  • 对不起,这不起作用,我正在使用 Firebug。我可以通过 JQuery 创建 cookie,但是一旦我发布的代码运行它就会删除 cookie,如果我刷新页面以再次运行该代码,它根本不会创建 cookie。
  • 你是否包含使用 Symfony\Component\HttpFoundation\Cookie; ?
  • @ClémentAndraud 我尝试了您的编辑,但仍然没有 cookie。是的,我确实包含了 Cookie 类。我已经发布了我的重定向代码,但我不确定它是否会有所帮助(我希望它会有所帮助)。
  • @JohntheRipper 我认为您的 cookie 没有设置为重定向功能。您是否尝试过在重定向功能后使用setVary()? [api.symfony.com/2.4/Symfony/Component/HttpFoundation/… 但在返回之前,您需要将重定向的 obj 分配给一个变量,然后 setVary(with cookies in header) 然后返回对象 $rdObj = $this->redirect(...); $rdObj->setVary(array(new cookies)); return $rdObj;
  • 我添加了自己的答案,因为我发现了这个愚蠢的错误:s
【解决方案2】:

糟糕,对不起大家。

这是我的错误。

在我的 javascript 中,我使用的是 Jquery cookie 插件,当您设置新 cookie 时,您会告诉它到期前的天数:

$.cookie('locationid', value, { expires: 365, path: '/' });

不幸的是,我在控制器中使用了该语法的一部分:

$cookie = new Cookie("locationid", $cookieLocation, 365, '/', null, false, false);

问题是第三个参数应该是 DateTime,所以当我认为我告诉它在 365 天后过期时,我可能创建了一个 cookie,它在创建后几乎立即过期。

感谢您提供的所有答案和时间,这就是我喜欢 SO 的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-01
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多