laravel 4持续数据正在进行 - jquery ajax提交

Posted

技术标签:

【中文标题】laravel 4持续数据正在进行 - jquery ajax提交【英文标题】:laravel 4 persisting data ongoing - jquery ajax submit 【发布时间】:2014-06-24 15:58:11 【问题描述】:

我在使用 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 $responsereturn 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提交的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 4会话不会在页面加载过程中持续存在

Laravel 4:股票身份验证登录不会跨页面持续存在

Laravel 仅在单元测试期间持续存在

Laravel 4 使用令牌进行身份验证

Laravel 4 验证唯一(数据库)忽略当前

GraphQL 和 Laravel 如何进行授权?