laravel 4持续数据正在进行 - jquery ajax提交
Posted
技术标签:
【中文标题】laravel 4持续数据正在进行 - jquery ajax提交【英文标题】:laravel 4 persisting data ongoing - jquery ajax submit 【发布时间】:2014-06-25 13:21:21 【问题描述】:我在使用 laravel 4.1 会话时遇到问题并出现意外行为。
根据我调用控制器方法的方式,会话是否有效我的应用程序调用 POST 路由 - 将项目添加到作为会话的购物车中。由于某种原因,会话没有得到更新。但是,如果我使用 GET 请求调用同一函数,则该函数按预期工作。
我的routes.php
包含这两条路线:
Route::get('testAdd', array('uses' => 'ProductsController@addToCart'));
Route::post('products/addToCart', array('uses' => 'ProductsController@addToCart'));
两者都指向同一个方法
方法目前是这样的(测试用):
public function addToCart()
Session::put("addcarttest", "add to cart");
return json_encode(Session::get('addcarttest'));
如果我使用 POST 方法(使用表单数据)调用函数,我会得到预期的结果和会话的内容。
但是,如果我随后检查会话(使用分析器)它不存在。数据没有持久化。
如果我随后使用 GET 路由调用相同的方法,我会得到预期的结果,但重要的是会话仍然存在。
我认为 POST 方法可能会删除会话,但是一旦它存在,它就会保留在那里 - 如果我使用 GET 方法并且 sessin 存在,如果我再次尝试 POST 方法示例,则会话仍然存在 - 所以 POST 方法不会删除会议。
这让我发疯 - 我为此浪费了很多时间,但不知道为什么。
我是否错过了 Laravel 如何处理 POST v GET 的内容?为什么两种不同的方法会对底层功能产生影响?
我需要做什么才能使会话与 POST 一起正常工作?
更新:
我现在已经尝试了会话的数据库驱动程序并且得到了相同的行为。
我已经进一步测试了一个阶段 - 我创建了一个基本表单并提交到 url 并且该方法按预期工作。我当前的表单数据是由 jquery ajax 提交的,并假设它们的行为完全相同。
我的 jquery 提交函数是这样的:
$.ajax(
url: '/products/addToCart',
type: 'POST',
async: false,
)
.done(function()
console.log("success");
)
.fail(function()
console.log("error");
)
.always(function()
console.log("complete");
);
return false;
我将 async 设置为 false - 我假设等待服务器响应。 (如果为 true 也不起作用)。
所以问题是表单提交和 ajax 提交之间的细微差别。两种方法都使用相同的路线和方法 - 一种保存会话数据 - 另一种不保存。
我该如何克服? Jquery 提交对于应用程序的这一部分是必不可少的。
【问题讨论】:
你可以尝试不同的会话方法,也许可以排除一些事情。非常有用的问题! laravel.com/docs/session#database-sessions 我会尝试使用数据库 - 目前正在使用文件 【参考方案1】:成功了!
我发现了与 laravel 3 相关的类似问题。为了使会话在 ajax 调用中持续存在,我需要正确返回响应。
return json_encode($response);
这是导致问题的原因。这似乎不是使会话持续存在的有效响应。我把它改成:
return Response::json($response);
这使会话得以持续!
由于某种原因,普通表单提交或调用方法允许第一个,但 ajax 不允许。
我在其他地方看到了有关影响会话数据的方法中的 echo 语句的引用,但我认为我没有任何参考 - 我认为返回的行为必须类似于 echo
现在快乐(直到下一个问题)
这是触发解决方案的帖子: http://forumsarchive.laravel.io/viewtopic.php?id=1304
【讨论】:
你先生让我很开心。我一直有同样的问题(见***.com/questions/23521781/…)。我正在使用 Laravel 4.1 以及以下设置:PHP 5.5.12,会话驱动程序“文件”。你的方法也解决了我的问题! 很高兴它有帮助。我在这个问题上浪费了很多时间——当我解决这个问题时,我几乎要开派对庆祝。找到答案后才有意义。 这实际上对我来说没有意义......当返回一个 JSON 字符串时,Laravel 会自动输出它......如果它自动输出它,我看不出我们应该调用的原因Response 类手动为我们执行 JSON 响应并确保会话是持久的。 我在我的构建中注意到它并不总是输出为 json。在我的原始代码中,javascript 代码没有将我的返回识别为 json。return $response
、return json_encode($response)
和 return Response::json($response)
之间的框架中必须有一个额外的步骤,但我知道的不够深入
非常感谢!我花了一整天的时间!【参考方案2】:
我有同样的问题,但返回 XML 响应时,不是 JSON。
我使用会话保存修复了它。
\Session::put('LOGADO.ID_LOJA', $id_loja.time());
\Session::save();
这修复了 AJAX 调用中的所有问题。
【讨论】:
【参考方案3】:这是参考雷给出的解决方案。 我有一个非常相似的问题,您的解决方案解决了。最初,我的控制器上有以下内容:
echo json_encode(array('auth' => $auth));
我把它改成了:
return Response::json(array('auth' => $auth));
但是,这只是解决方案的一部分。在我的 javascript 文件中,我最初有:
data = $.parseJSON(data);
如果我将回声保留在控制器中,那将是需要的。显然,当使用 Response::json() 时,Laravel 会在幕后发挥一些作用,以便返回的数据已经被解析。在我的 javascript 文件中删除该行让一切再次变得愉快:)
【讨论】:
以上是关于laravel 4持续数据正在进行 - jquery ajax提交的主要内容,如果未能解决你的问题,请参考以下文章