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

我在使用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提交,并假设它们在behviour中完全相同。

我的jquery提交function是这样的:

 $.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提交对于应用程序的这一部分至关重要。

成功!

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

 return json_encode($response); 

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

 return Response::json($response); 

这使会话保持不变!

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

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

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

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

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

我使用会话保存修复它。

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

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

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

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

我改为:

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

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

 data = $.parseJSON(data); 

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