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文件中删除该行使一切都快乐了:)