Laravel忽略验证错误并使表单消失



我创建了一个动态表单来输入远足装备项目。一开始,用户看到的只是一个"选择装备类别"下拉菜单,根据选择的装备类别(例如:"避难所"( - 出现另一个下拉菜单供用户选择装备物品的类型(例如:"帐篷"(。然后,一旦做出选择,用户就会获得一般功能(如价格、重量、品牌、名称等(的通用形式 + 根据类型获取(带有 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!我在这里做错了什么?

你试图像Javascript一样使用Laravel,这是行不通的。

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

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

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

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

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

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

使用类似Livewire的东西。

最新更新