Laravel 5.4验证错误信息不显示问题咨询及解决方法
解决Laravel 5.4 AJAX提交时验证错误不显示的问题
你猜的没错,AJAX提交确实是导致错误信息不显示的核心原因。Laravel的默认验证逻辑在处理普通表单提交时,会把错误信息存入session,然后重定向回表单页面,这时候$errors变量才能被messages.blade.php读取到。但AJAX请求是异步的,Laravel会直接返回JSON格式的错误响应,不会走session存储错误的流程,所以你的模板里count($errors)永远是0,自然看不到错误提示。
下面分两步给你解决这个问题:
一、后端代码(基本不需要改动,保持现有逻辑即可)
你的AddInfoController里的store方法没问题,Laravel的validate方法会自动识别AJAX请求,当验证失败时返回422 Unprocessable Entity状态码和JSON格式的错误数据。如果需要自定义成功响应,可以加上返回语句:
public function store(Request $request) { $this->validate($request,[ 'fileno' => 'required|unique:AddInfoModel|max:255', ]); // 验证通过后执行保存逻辑 // AddInfoModel::create($request->all()); 示例保存代码 // 返回成功响应 return response()->json(['success' => '信息添加成功']); }
二、前端AJAX代码(重点修改部分)
你需要在AJAX的错误回调里处理422状态码的响应,手动把错误信息渲染到页面上。假设你用jQuery写AJAX,示例代码如下:
// 监听表单提交事件 $('form').on('submit', function(e) { e.preventDefault(); // 阻止默认表单提交行为 $.ajax({ url: $(this).attr('action'), // 从表单的action属性获取提交地址 method: $(this).attr('method'), // 获取请求方法(POST) data: $(this).serialize(), // 序列化表单数据 headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') // 必须携带CSRF令牌,Laravel要求 }, success: function(response) { // 处理成功场景:提示成功信息、重置表单等 alert(response.success); $('form')[0].reset(); // 如果之前有错误提示,清空它 $('.alert-danger').remove(); }, error: function(xhr) { // 先清空之前的错误提示 $('.alert-danger').remove(); // 只处理422验证错误 if (xhr.status === 422) { let errors = xhr.responseJSON.errors; // 遍历所有错误信息,逐个渲染到表单上方 $.each(errors, function(field, messages) { // messages是数组,取第一个错误信息即可 $('form').prepend(`<div class="alert alert-danger">${messages[0]}</div>`); // 也可以给对应的输入框加样式提示,比如: // $(`input[name="${field}"]`).addClass('border-danger'); }); } else { // 处理其他错误,比如500服务器错误 $('form').prepend('<div class="alert alert-danger">服务器出错,请稍后重试</div>'); } } }); });
额外检查点
除了AJAX的问题,你也可以快速排查以下几点:
- 确认表单的
action属性正确指向了AddInfoController@store的路由 - 页面头部是否包含了CSRF令牌的meta标签:
<meta name="csrf-token" content="{{ csrf_token() }}">,没有的话AJAX会报419错误 - 确认
messages.blade.php确实被main.blade.php正确引入(不过AJAX场景下这个模板里的$errors逻辑已经用不上了,主要靠前端渲染错误)
内容的提问来源于stack exchange,提问作者kobi
相关产品推荐
相关产品推荐

