Laravel Настройка файлов cookie с помощью Ajax

У меня проблемы с настройкой файлов cookie в laravel через ajax. Я прочитал ряд вопросов / сообщений безрезультатно.

У меня есть раскрывающийся список, который при изменении использует js для отправки своего значения контроллеру, который устанавливает файл cookie и возвращает ответ с этим файлом cookie, затем страница обновляется после завершения ajax, а в сценарии document.ready он вызывает маршрут get cookie, который извлекает значение из этого cookie. похоже, что файл cookie не отправляется? Я знаю, что путь получения работает, как если бы я установил файл cookie в другом месте, он извлекает его правильно. Я также использовал headers_sent(), чтобы убедиться, что заголовки еще не были отправлены до установки файла cookie и возврата ответа. Я также пробовал несколько различных подходов, которые я видел в других вопросах и ответах SO, включая Cookie::queue, $response-›withCookie($cookie) и $response-›headers-›setCookie($cookie), ни один из которых я нашел работу.

Есть ли проблема с моим подходом? или это скорее проблема синтаксиса?

Мой javascript:

function trans(lang){
    $.post( 'cookie/set' , {'name':'language', 'value':lang, 'timeout':-1})
    .done(function(data){
        removeEvent();
    }).always(function(){
        window.location.reload();
    });
}

Функция контроллера для cookie/set:

public function postSet(){
    $name = Input::get('name');
    $value = Input::get('value');
    $timeout = Input::get('timeout');
    if(Request::ajax()){
        Log::info('cookie', array('name'=>$name, 'value'=>$value, 'timeout'=>$timeout));
        $cookie = Cookie::make($name, $value, $timeout);
        $response = Response::make();
        $response->headers->setCookie($cookie);
        return $response->withCookie($cookie);
    }
}

doc.ready javascript:

$(document).ready(function(){
    $.post( 'cookie/get' , {'name':'language'})
    .done(function(data){
        if (!data){
            alert('no cookie');
        }
        $("#language").val(data);
        removeEvent();
    });
})

и, наконец, функция контроллера cookie/get:

public function postGet(){
    $name = Input::get('name');
    define('__TRANSLATEMODE',"raw");
    return Cookie::get($name);
}

Опять же, я могу подтвердить, что маршрут get работает правильно. Я думаю, что каким-то образом файл cookie не возвращается с ответом на вызов set ajax, но я не понимаю, почему.

Заранее спасибо за вашу помощь! -Уолли

РЕДАКТИРОВАТЬ:

Я просмотрел запрос и ответы в firebug, и оказалось, что ответ от маршрута postSet не содержит cookie. Я как-то подозревал это. но, по крайней мере, это прибивает источник проблемы. Все еще не уверен, почему он не хочет работать.

Редактировать 2:

Я решил это. Не совсем уверен, почему это работает, но приведенный ниже код теперь работает. Кажется, что возврат пустого ответа не приведет к отправке файлов cookie? Не знаю, по крайней мере, это решено. Я отвечу на это, когда это позволит мне, и отмечу его как принятое. (Если кто-нибудь знает, ПОЧЕМУ это исправлено, комментарии будут очень признательны.)

public function postSet(){
    $name = Input::get('name');
    $value = Input::get('value');
    $timeout = Input::get('timeout');
    Cookie::queue($name, $value, $timeout);
    $response = Response::make();
    return Response::make('test');
}

Спасибо тем, кто посмотрел, и, надеюсь, это поможет кому-то еще. -Уолли


person EpicWally    schedule 24.04.2014    source источник


Ответы (2)


Я вижу, что у вас есть функция js Post с Get Route. Это не будет работать в Laravel.

Не уверен, что это вся проблема, но проверка маршрутов определенно поможет вам сузить ее.

person Keith Mifsud    schedule 24.04.2014
comment
Маршрут является почтовым маршрутом. Его имя «get», отсюда и название функции postGet(). (Знаю, не самое лучшее название.) Я знаю, что этот маршрут работает по назначению. Я считаю, что виновата функция postSet. Это или порядок операций в JS, т.е. перезагрузка страницы перед отправкой ответа с куками. и т.п. - person EpicWally; 25.04.2014
comment
Я думаю, у вас та же проблема, что и здесь вызов ajax laravel"> stackoverflow.com/questions/22903995/ - person Keith Mifsud; 25.04.2014
comment
Я также использовал headers_sent(), чтобы убедиться, что заголовки еще не были отправлены до установки файла cookie и возврата ответа. Так что не та же проблема. - person EpicWally; 01.05.2014

Я решил это. Не совсем уверен, почему это работает, но приведенный ниже код теперь работает. Кажется, что возврат пустого ответа не приведет к отправке файлов cookie? Не знаю, по крайней мере, это решено. Я отвечу на это, когда это позволит мне, и отмечу его как принятое. (Если кто-нибудь знает, ПОЧЕМУ это исправлено, комментарии будут очень признательны.)

public function postSet(){
    $name = Input::get('name');
    $value = Input::get('value');
    $timeout = Input::get('timeout');
    Cookie::queue($name, $value, $timeout);
    $response = Response::make();
    return Response::make('test');
}

Спасибо тем, кто посмотрел, и, надеюсь, это поможет кому-то еще. -Уолли

person EpicWally    schedule 01.05.2014