为了账号安全,请及时绑定邮箱和手机立即绑定

在 Laravel 5.8 中提交后,使用 @error 指令从多个输入字段中定位前一个输入字段

在 Laravel 5.8 中提交后,使用 @error 指令从多个输入字段中定位前一个输入字段

PHP
撒科打诨 2022-01-14 16:57:22
Laravel 5.8.13中引入了新的 @error 指令。所以,而不是这样做:// 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.phppublic function update(Request $request, Account $account){    if($request->input('credit') < 0)    {        return back()->withErrors(['credit'=>'enter a positive amount']);    }    // ... other logic}问题是,当在一个输入字段中输入负数时,错误消息会针对每个具有相同名称的输入显示,即使它们的形式不同也是如此。我认为使输入名称唯一可以解决这个问题,但这会使我的后端逻辑比所需的更复杂。无论如何,在重定向后只为目标输入显示错误消息,而不必为每个输入字段使用唯一名称?
查看完整描述

2 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

有趣的是,该 @error 指令没有通过输入名称以编程方式绑定到任何输入字段。它仅通过接近度与输入字段在空间上相关,并且可以放置在页面上的任何位置。


@error此外,只要将相同的字符串传递给withErrors()控制器中的调用,您就可以方便地使用指令中的任何字符串。


因此,解决在多个输入中定位适当输入的问题变得像使用任何唯一字符串(不一定是目标输入名称)作为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 指令的代码,并且不会导致显示错误消息。


查看完整回答
反对 回复 2022-01-14
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

解决方案将执行以下操作:

  • 使用提交按钮的值将值/发布的表单存储在变量中

  • 放弃错误指令并使用旧版本

  • 将旧版本与变量结合起来检查你是否有正确的形式

你会得到这样的东西:

@if ($errors->has('email') && $submitted_form_identifier === $form_identifier) 

    <span>{{ $errors->first('email') }}</span> 

@endif


查看完整回答
反对 回复 2022-01-14
  • 2 回答
  • 0 关注
  • 361 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号