我似乎无法从我的控制器中设置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),运行上面的代码会删除它,但它不会设置它。
修改:已发布行动代码。
答案 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。
感谢您所有的答案和花费的时间,这就是我喜欢的原因。