Laravel 5.6 无需传递页面数据的Ajax请求实现疑问
嘿,你的思路其实已经很接近了!不过有几个小细节调整一下就能完美实现需求,而且能让代码更符合Laravel的安全规范。
首先说下现有代码的小问题:GET请求不适合用来修改数据库数据(RESTful规范里GET是用来获取资源的,POST/PUT才是修改资源的正确方式),而且你还需要补充日期字段的存储逻辑。下面是调整后的完整方案:
1. 调整路由为POST类型
把原来的GET路由改成POST,既符合规范也更安全:
Route::post('/application-background-sent/{id}', 'ApplicationsController@backgroundSent');
2. 更新Ajax请求(带上CSRF令牌)
Laravel会拦截没有CSRF令牌的POST请求,所以我们需要给Ajax请求加上令牌,同时把请求类型改成POST:
首先在页面的<head>标签里添加CSRF元标签:
<meta name="csrf-token" content="{{ csrf_token() }}">
然后修改你的Ajax代码:
var url2 = "/application-background-sent/{{$application->id}}"; $(document).ready(function(){ // 全局配置CSRF令牌,让所有Ajax请求自动带上 $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } }); $('#bgSubmit').click(function(e){ // 阻止按钮默认的表单提交行为(如果按钮在表单内的话) e.preventDefault(); $.ajax({ url: url2, success: function(data) { alert(data.success); }, error: function() { alert('提交失败,请稍后重试'); }, type: 'POST' }); }); });
3. 完善控制器的存储逻辑
加上日期字段的赋值(假设你的数据库表有bg_check_submitted_at字段用来存储提交日期):
public function backgroundSent($id) { $application = Application::findOrFail($id); $application->bg_check_submitted_by = Auth::user()->name; // 存入当前时间,Laravel的now()会自动生成符合数据库格式的时间 $application->bg_check_submitted_at = now(); $application->save(); return response()->json(['success'=>'数据已成功保存']); }
额外小提示
如果你不想全局配置CSRF令牌,也可以直接在Ajax的data参数里单独传入:
$.ajax({ url: url2, data: { _token: '{{ csrf_token() }}' }, // ...其他参数不变 });
内容的提问来源于stack exchange,提问作者maximus1127
相关产品推荐
相关产品推荐

