У меня проблемы с настройкой файлов 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');
}
Спасибо тем, кто посмотрел, и, надеюсь, это поможет кому-то еще. -Уолли