【问题标题】:Laravel ignores validation errors and makes form disappearLaravel 忽略验证错误并使表单消失
【发布时间】:2020-09-28 18:39:01
【问题描述】:

我创建了一个动态表单来输入远足装备项目。一开始,用户看到的只是一个“选择齿轮类别”下拉菜单,并且根据选择的齿轮类别(例如:“避难所”) - 出现另一个下拉菜单供用户选择齿轮项目的类型(例如: “帐篷”)。然后,一旦做出选择,用户就会得到一个通用形式的一般特征(如价格、重量、品牌、名称等)+ 一个视图部分,根据类型(如果它是一个帐篷)获取(使用 axios)特殊特征- 它会得到人数,如果它是一个背包 - 承载能力等)

具有特殊功能div的表单结构示例:

 <div class="form-group col-md-6">

                                        <select class="custom-select" name="manufacturer_id">
                                            <option value="" selected>Brand</option>
                                            @forelse ($manufacturers as $manufacturer)
                                            <option value="{{ $manufacturer->id }}"
                                                {{ (old("manufacturer_id") == $manufacturer->id ? "selected" : "") }}>
                                                {{ $manufacturer->name }}</option>
                                            @empty
                                            <option>No manufacturers</option>
                                            @endforelse
                                        </select>

                                        <small id="manufacturerHelp" class="form-text text-muted ">Not on our list? - <a
                                                href="#" data-toggle="modal" data-target="#manuf_modal">Add
                                                new</a>.</small>

                                        @error('manufacturer_id')
                                        <small class="text-danger">{{ $message }}</small>
                                        @enderror
                                    </div>
                                </div>

                                <div class="container pt-3" v-show="formDisplay" id="itemType"
                                    style="background: #e1f7d5">
                                    <!-- This div displays the partial view related to the sub category chosen -->
                                </div>

到目前为止一切顺利。我设法通过我的控制器将数据分配到适当的表中。这是我的“商店”方法:

public function store(){

        $data = request()->validate([

            'gear_categories_id' => 'required',
            'sub_categories_id' => 'required', 
            'name' => 'required', 
            'manufacturer_id' => 'required', 

        ]);


        $gearItem = auth()->user()->gearItem()->create($data);

        $featureModel = SpecialFeature::where('sub_categories_id', $gearItem->sub_categories_id)->value('model_name');

        $specialFeatures =  'App\\'.$featureModel;
        $featuresData['gear_items_id'] = $gearItem->id;
        $featureNames = SpecialFeature::where('sub_categories_id', $gearItem->sub_categories_id)->get();

        foreach ($featureNames as $featureName) {
            if (SpecialFeature::where('required', 0)->get()){
                $featuresData[$featureName->feature_name] = request($featureName->feature_name); 
            } else {
                $featuresData = request()->validate([
                    $featureName->feature_name => 'required'
                ]);
            }
        }

        $specialFeatures::create($featuresData);

        return redirect('/gearitem/'.$gearItem->id);

    }

问题是,当我故意不填写表单中的必填字段时 - 而不是保持表单显示稳定并显示消息错误 - 整个事情消失了,只留下顶部下拉(齿轮类别) 您必须再次重新选择类别 - 才能看到错误。

另外一件事 - 如果在获取的“特殊功能” div (id="itemType") 中有必填字段 - 当用户不填写这些字段时,甚至不会显示错误。 @error 被完全忽略!我在这里做错了什么?

【问题讨论】:

  • 良好的代码缩进将帮助我们阅读代码,更重要的是,它将帮助您调试代码Take a quick look at a coding standard 为您自己的利益。您可能会被要求在几周/几个月内修改此代码,最后您会感谢我的。
  • 它在我的 IDE 中正确缩进,当我将它复制到这里时,它变得一团糟。

标签: php vue.js laravel-7


【解决方案1】:

您正在尝试像 Javascript 一样使用 Laravel,但这是行不通的。

Laravel 只会在服务器上处理,这意味着在提交表单时它会通过路由重定向到服务器,并且在出错时会重定向回新加载的页面。

所以当它返回时,它会回到最初的新加载状态,并且因为您正在动态地将表单调用到服务器已呈现的页面并且发现不需要输出错误。

所以问题不在于 Laravel 删除了您的表单而不是输出错误,而是您尝试使用动态页面实现它的方式。

有几个选项可以尝试做你想做的事:-

您可以向页面添加一些逻辑,以在重定向返回时查找额外的变量,该变量会记住状态、加载表单并使用数据和错误填充它。

对路由进行 AJAX 调用以验证并使用 javascript 承诺更新屏幕上的表单。

使用 Livewire 之类的东西。

【讨论】:

  • "您可以在页面中添加一些逻辑,以在重定向返回时查找额外的变量,该变量会记住状态、加载表单并使用数据和错误填充它" - 好的,但是什么样的逻辑?这是某种类似于“防止默认”的命令吗?只要用户未更正错误,如何保持表单稳定且出现错误?
  • 例如,将 item_id 与表单一起提交并返回错误信息,如果 item_id 在视图有效负载中,那么您知道它来自表单验证问题。因此,不要通过 ajax 加载表单,而是将表单插入 laravel 刀片并填充数据和错误。阻止默认是一个 javascript 命令,用于停止以传统方式发送的表单,以便您可以将其替换为 ajax 调用。快速谷歌搜索返回此codingdriver.com/…
猜你喜欢
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多