【问题标题】:Using @error directive to target the previous input field from multiple input fields after submit in Laravel 5.8在 Laravel 5.8 中提交后,使用 @error 指令从多个输入字段中定位前一个输入字段
【发布时间】:2020-01-19 01:52:05
【问题描述】:

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

表单提交给AccountController.php中的update()方法

public function update(Request $request, Account $account)
{
    if($request->input('credit') < 0)
    {
        return back()->withErrors(['credit'=>'enter a positive amount']);
    }
    // ... other logic
}

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

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

有没有办法在重定向后只显示目标输入的错误消息,而不必为每个输入字段使用唯一的名称?

【问题讨论】:

  • 既然你没有使用Validator,为什么不直接使用JS来检查一个正数呢?然后,您可以单独定位每个字段。但是在服务器端,您可以使用一条错误消息,但您必须通过设置不同的名称来使每个字段唯一。一页上有多个表单的缺点。
  • @nakov,在使用 javascript 之前,我希望页面功能齐全。这只是我首选的网络编码方式。
  • 没关系,那么您必须通过为输入字段指定不同的名称并覆盖错误消息来区分输入字段。否则这将是一个混乱的方式来实现它。我知道一个,但我不会分享它,因为它很丑。
  • @nakov,你的意思是@error 指令总是与给定的输入名称相关联吗?
  • @error 指令只是根据作为输入名称的键从元素数组中提取,所以是的,它与具有给定名称的输入相关联。所以下面的解决方案也是我想到的,但我更喜欢使用 JS 进行这样的验证。当您验证只是检查数字是否为正时..

标签: php laravel laravel-blade laravel-5.8


【解决方案1】:

解决方案如下:

  • 使用提交按钮的值将值/已发布表单存储在变量中
  • 放弃错误指令并使用旧版本
  • 将旧版本与变量结合起来检查您的表格是否正确

你会得到这样的东西:

@if ($errors->has('email') && $submitted_form_identifier === $form_identifier) 
    <span>{{ $errors->first('email') }}</span> 
@endif

【讨论】:

  • 感谢您的回答。 @error 指令应该使这个逻辑更简单。所以,放弃它,不是一个选择。我一定是对用法有误解。
  • @UdoE。该指令只是 PHP 的一部分,在为缓存生成文件时将对其进行解析。当您声明该指令应该使事情变得更简单时,您是正确的,但这仅适用于“标准”情况。您可以轻松地为这种情况创建自己的指令,当您想要简单的逻辑时,这将是我的建议。
【解决方案2】:

有趣的是,@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 指令的代码,并且不会显示任何错误消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    相关资源
    最近更新 更多