在Laravel 5.8中提交后,使用@error指令将多个输入字段中的先前输入字段作为目标

时间:2019-09-18 07:18:54

标签: php laravel laravel-blade laravel-5.8

新的@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
}

问题是,当在一个输入字段中输入负数时,即使输入格式不同,对于相同名称的每个输入也会显示错误消息。

我认为使输入名称唯一可以解决此问题,但这会使后端逻辑变得比所需的更为复杂。

无论如何,重定向后是否仅针对目标输入显示错误消息,而不必为每个输入字段使用唯一的名称?

2 个答案:

答案 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伪指令的代码,并且不会显示任何错误消息。