laravel 4持续存在数据 - jquery ajax提交

时间:2014-05-08 08:43:56

标签: php jquery session laravel laravel-4

我在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的方法?为什么两种不同的方法会对底层函数产生影响?

我需要做什么才能使会话正常运行?

更新

我现在已经尝试了会话的数据库驱动程序,并且得到了同样的行为。

我已经进一步测试了一个阶段 - 我创建了一个基本表单并提交到了url,并且该方法按预期工作。我目前的表单数据由jquery ajax提交,并假设它们在behviour中完全相同。

我的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 - 我假设等待服务器响应。 (如果不对,也无效)。

所以问题是表单提交和ajax提交之间的细微差别。两种方法都使用相同的路由和方法 - 一种方法保存会话数据 - 另一种方法不存在。

我怎样才能克服? Jquery提交对于应用程序的这一部分至关重要。

3 个答案:

答案 0 :(得分:10)

成功!

我发现了与laravel 3相关的类似问题。对于要在ajax调用中持续存在的会话,我需要正确返回响应。

return json_encode($response);

这导致了问题。它似乎不是一个有效的响应,使会话能够持久存在。我改成了:

return Response::json($response); 

这使会话保持不变!

由于某种原因,正常表单提交或调用方法允许第一个,但ajax不允许。

我在其他地方看过有关影响会话数据的方法中的echo语句的引用,但我认为没有任何东西 - 我认为返回的行为必须类似于echo

现在开心(直到下一个问题)

这是触发解决方案的帖子: http://forumsarchive.laravel.io/viewtopic.php?id=1304

答案 1 :(得分:1)

我有同样的问题,但是在返回XML Response时,不是JSON。

我使用会话保存修复了它。

\Session::put('LOGADO.ID_LOJA', $id_loja.time());

\Session::save();

这修复了AJAX Calls中的所有内容。

答案 2 :(得分:1)

这是参考Ray给出的解决方案。 我有一个非常类似的问题,你的解决方案解决了。最初,我的控制器上有以下内容:

echo json_encode(array('auth' => $auth));

我将其更改为:

return Response::json(array('auth' => $auth));

但是,这只是解决方案的一部分。在我的javascript文件中,我最初有:

data = $.parseJSON(data);

如果我在控制器中保留了回声......那就需要了。显然,当使用Response :: json()时,Laravel会在幕后做一些魔术,以便已经解析了返回的数据。删除我的javascript文件中的那一行使得一切都很开心:)