【发布时间】:2014-06-10 07:32:49
【问题描述】:
我无法通过 ajax 在 laravel 中设置 cookie。我已经阅读了许多问题/帖子无济于事。
我有一个下拉菜单,当更改时,使用 js 将其值发布到控制器,该控制器设置 cookie 并返回带有该 cookie 的响应,然后在 ajax 完成时刷新页面,并在 document.ready 脚本中,它调用一个 get cookie 路由,该路由从该 cookie 中检索值。似乎没有发送cookie?我知道获取路径有效,就好像我在其他地方设置了 cookie,它可以正确检索它。我还使用 headers_sent() 来确保在设置 cookie 并返回响应之前尚未发送标头。我还尝试了许多在其他 SO 问题和答案中看到的不同方法,包括 Cookie::queue、$response->withCookie($cookie) 和 $response->headers->setCookie($cookie), none我发现其中的一个工作。
我的方法有问题吗?还是更可能是语法问题?
我的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:
我解决了。不完全确定为什么会这样,但下面的代码现在可以工作了。似乎返回一个空响应不会发送cookies?不知道,至少解决了。我会在允许的时候回答这个问题,并将其标记为已接受。 (如果有人知道为什么要修复它,将不胜感激 cmets。)
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');
}
感谢那些看过的人,希望这对其他人有所帮助。 -沃利
【问题讨论】:
标签: javascript jquery ajax cookies laravel-4