新的@error指令为introduced in Laravel 5.8.13。因此,不要这样做:
// old
@if ($errors->has('email'))
<span>{{ $errors->first('email') }}</span>
@endif
您现在可以执行此操作
// new
@error('email')
<span>{{ $message }}</span>
@enderror
但是,在尝试仅将几个错误的输入字段中出现错误的输入字段作为目标时,我遇到了问题。这些字段相似,因为它们具有相同的名称。但是它们的格式也不同,并且具有不同的提交按钮。
我的html刀片文件是使用@forelse
语句生成的多个输入设置的。我创建了一个简单的错误检查,以检查是否输入了负数,并通过错误消息重定向回同一页。 @error
指令还用于将自定义类插入目标输入字段以进行样式设置。
@forelse($accounts as $account)
<form method="POST" action="{{ route('account.update', $account->id) }}">
@csrf
<div>
<input type="number" name="credit" class="@error('credit') is-invalid @enderror" required>
<input type="submit" class="btn" value="ok">
@error('credit')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</form>
@empty
@endforelse
该表单将提交到update()
中的AccountController.php
方法
public function update(Request $request, Account $account)
{
if($request->input('credit') < 0)
{
return back()->withErrors(['credit'=>'enter a positive amount']);
}
// ... other logic
}
问题是,当在一个输入字段中输入负数时,即使输入格式不同,对于相同名称的每个输入也会显示错误消息。
我认为使输入名称唯一可以解决此问题,但这会使后端逻辑变得比所需的更为复杂。
无论如何,重定向后是否仅针对目标输入显示错误消息,而不必为每个输入字段使用唯一的名称?
答案 0 :(得分:0)
解决方案将执行以下操作:
您会得到这样的东西:
@if ($errors->has('email') && $submitted_form_identifier === $form_identifier)
<span>{{ $errors->first('email') }}</span>
@endif
答案 1 :(得分:0)
有趣的是,@error
指令不是通过编程方式通过输入名称绑定到任何输入字段的。它仅在空间上与输入字段相关,并且与邻近区域相关,并且可以放置在页面上的任何位置。
此外,只要将@error
指令中的任何字符串传递给控制器中的withErrors()
调用,您都可以方便地使用它。
因此,解决在多个输入之间定位适当输入的问题变得像使用 any 唯一字符串(不一定是目标输入名称)作为输入中的键一样简单。 withErrors()
方法调用并通过将相同的字符串传递给@error
指令来检索错误消息。就我而言,我选择使用帐户ID作为唯一字符串。
在AccountController.php
中:
public function update(Request $request, Account $account)
{
if($request->input('credit') < 0)
{
return back()->withErrors([$account->id=>'enter a positive amount']);
}
// ... other logic
}
在html刀片模板中:
@forelse($accounts as $account)
<form method="POST" action="{{ route('account.update', $account->id) }}">
@csrf
<div>
<input type="number" name="credit" class="@error($account->id) is-invalid @enderror" required>
<input type="submit" class="btn" value="ok">
@error($account->id)
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</form>
@empty
@endforelse
注意:在任何@error
伪指令中使用不存在的键会破坏其他@error伪指令的代码,并且不会显示任何错误消息。