Question

I can't seem to get cookies set from my controller.

code:

/**
     * @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;
    }

Do I have to return the response? If I do how do I keep processing (I have a redirect further down in my code)?

Edit: Interestingly enough if the same cookie is already set (via JQuery) running the code above deletes it, but it won't set it.

Edit: Action code posted.

Was it helpful?

Solution 2

Oops, Sorry everyone.

It's my error.

In my javascript I'm using a Jquery cookie plugin and when you set a new cookie you tell it the number of days before expiry:

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

Unfortunately I used a part of this syntax in my controller:

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

The problem is the third parameter is supposed to be a DateTime so while I thought I was telling it to expire in 365 days I probably created a cookie that expired almost instantly after creation.

Thanks for all the answers and time spent on your part, this is why I love SO.

OTHER TIPS

The cookie object has httpOnly set to true by default, http://api.symfony.com/2.0/Symfony/Component/HttpFoundation/Cookie.html

This means that the browser should not make the cookie visible to client-side scripts. If you need to see the cookie in your scripts you can pass the 7th parameter as false when you create the cookie.

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

If you just need to view the cookie for debugging purposes you can use Chrome Dev tools. They are available under the 'Resources' tab.

Edit : Try $response->sendHeaders();

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top