Symfony2 Cookies未在控制器中设置

时间:2014-05-06 14:47:50

标签: php symfony cookies

我似乎无法从我的控制器中设置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),运行上面的代码会删除它,但它不会设置它。

修改:已发布行动代码。

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:1)

哎呀,对不起大家。

这是我的错误。

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

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

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

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

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

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