Laravel 8.65 验证错误消息和旧值未显示在 Blade 文件中

Posted

技术标签:

【中文标题】Laravel 8.65 验证错误消息和旧值未显示在 Blade 文件中【英文标题】:Laravel 8.65 validation error messages and old values not showing in Blade files 【发布时间】:2021-12-29 03:21:54 【问题描述】:

我正在使用 FormRequest 来验证数据。我知道这个问题被问了很多次,社区试图通过多种方式解决这个问题,但没有一个能解决我的问题。附上参考链接。

我的问题描述

我有一些复杂的表单,它的一些 html 是从我的 JQuery 代码生成的。当 Jquery 代码未填充到表单上时,后端验证和旧值工作正常,但当 JQuery HTML 出现在表单中并提交表单时,旧值和验证错误不起作用。附上图片以获得更多解释。

第 1 步点击付款条款

第 2 步选择条款并确认

第 3 步在从 JQuery 填充的付款百分比输入字段中添加值。

表单请求

class AbcRequest extends FormRequest

    public function authorize()
    
        return true;
    

    public function rules()
    
        return [
            'payment_term' => ['required'],
            'payment_percent' => ['required'],
            'other_info' => ['required'],
        ];
    

web.php

Route::group(['middleware' => ['auth', 'approved']], function () 
    Route::post('/abc/store', 'AbcController@store')
        ->name('abc.store');
);

刀片

<form method="post" action=" url('/abc/store') " 
      enctype="multipart/form-data">
    @csrf
    <input type="text" name="payment_term" class="form-control" 
           value=" old('payment_term') ">
    @error('payment_term')
    <div class="backend-error">  $message  </div>
    @enderror
</form>

到目前为止我所做的尝试

社区链接

    Laravel Validation MessageBag contains errors however not showing up in blade file Laravel 5 validate error message not showing Laravel 8 - Old inputs and validation error messages are not working https://github.com/laravel/framework/issues/26367 https://laravel.io/forum/why-laravel-validation-dont-displaying-errors https://laracasts.com/discuss/channels/laravel/error-messages-are-not-shown-after-validation Laravel 5.2 validation errors not appearing

社区建议的控制器代码

public function store(Request $request)

    $validator = Validator::make($request->all(), [
        'payment_term' => ['required'],
        'payment_percent' => ['required'],
        'other_info' => ['required'],
    ]);
    
    if ($validator->fails()):
        return redirect()->back()
            ->withErrors($validator)
            ->withInput();
    endif;

【问题讨论】:

问题似乎出在客户端,但您没有提供这些代码。我也同意@Martin 的回答。 我在刀片文件中使用$errors 打印错误和print_r(old()),但两者都是空的。这意味着后端存在一些问题,laravel 在幕后维护所有这些事情。你有什么建议? 只有当任何动态 html 出现在我的表单中并提交它然后验证应用并重定向回表单然后 $errorsold() 为空时才会发生。这对我来说真的很奇怪,而且真的从来没有遇到过这个奇怪的问题 你能分享 jquery 填充的 HTML 吗?字段是否具有唯一的名称属性集?这个 HTML 是否填充在 &lt;form&gt; &lt;/form&gt; 中? jQuery 代码是什么?它是如何添加其他元素的?它们是如何命名的? 【参考方案1】:

免责声明:如果我没有正确理解您的问题,我很抱歉,我会尽力而为。

如果您在客户端使用 jQuery 创建一些 HTML 输入,Laravel 将无法将任何旧输入值或验证错误插入到您的 HTML 中,因为您所指的 DOM 元素根本不存在于在您的网络服务器上呈现的时间。

基本上,我可以想到两种方法来解决这个问题:让 Laravel 渲染这些 HTML 元素并使用 CSS 隐藏它们。然后,您的 javascript 可能(有条件地?)通过操作 CSS 显示先前隐藏的元素。另一种选择是将旧输入值和验证错误模板化到内联脚本标记中的 JavaScript 变量中,您的 jQuery 代码可以解析这些变量,例如通过在 JSON 中编码和解码这些值。

【讨论】:

感谢@Martin 的评论。是的,但问题是 laravel 不会在刀片文件中发送任何错误消息和 old() 输入值。我正在通过$errorsprint_r(old()) 打印错误消息和旧值,但在刀片文件中两者都是空的。 @Marting 我附上了一些图片以供详细说明,请看一下。

以上是关于Laravel 8.65 验证错误消息和旧值未显示在 Blade 文件中的主要内容,如果未能解决你的问题,请参考以下文章

怎样在excel表中限制操作的单元区域,并且在A1输入一个值,在B1内显示A1的新值和旧值的和呢?!

如何根据输入请求规则在 laravel 刀片中显示错误消息

Laravel 6 - 显示验证消息的新方法

为啥 laravel 验证不显示错误

watch监控,对比新值和旧值做出相应判断

Laravel同时显示多种语言验证错误