在视图中呈现验证错误,避免重复

Presenting Validation errors in View, avoiding repetition

循环遍历验证器错误然后在表单元素之后立即显示它们而不求助于大量 @if 子句的最佳方法是什么?

这既不优雅也不枯燥:

<input name="name" />
@if (isset($errors['name']))
    <div class="error">{!! $errors['name'] !!}</div>
@endif

<input name="email" />
@if (isset($errors['email']))
    <div class="error">{!! $errors['email'] !!}</div>
@endif

<input name="address" />
@if (isset($errors['address']))
    <div class="error">{!! $errors['address'] !!}</div>
@endif

我想避免这种重复。有没有一种方法可以使用 PHP 数组或负责整个过程的程序包生成表单元素,并在表单元素之后立即放置错误 div?

我不知道有任何软件包,但我会创建自己的宏 class,类似于 HTML 生成器或表单生成器。

事实上,我可能会扩展 FormBuilder.php 并添加一些额外的方法,例如:

public function inputWithError($type, $name, $errors, $value = null, $options = array())
{
    $errorString = '';
    if(isset($errors[$name])) {
        $errorString = '<div class="error">{$errors[$name]}</div>';
    }
    return $this->input($type, $name, $value, $options) . $errorString;
}

注意 可以找到 FormBuilder 包 here

编辑

目录可能是:

/App/App/ExtendedInput
 |
 +- ExtendedInput.php
 |
 +- ExtendedInputFacade.php
 |
 +- ExtendedInputServiceProvider.php

ExtendedInput.php

use Illuminate\Html\FormBuilder;

class ExtendedInput extends FormBuilder 
{

    public function inputWithError($type, $name, $errors, $value = null, $options = array())
    {
        $errorString = '';
        if(isset($errors[$name])) {
            $errorString = '<div class="error">{$errors[$name]}</div>';
        }
        return $this->input($type, $name, $value, $options) . $errorString;
    }
}

ExtenedInputFacade.php

use Illuminate\Support\Facades\Facade;

class ExtendedInputFacade extends Facade {

    protected static function getFacadeAccessor() { return 'extendedInput'; }

}

ExtendedInputServiceProvider.php

use Illuminate\Support\ServiceProvider;

class ExtendedInputServiceProvider extends ServiceProvider {

    public function register()
    {
        $this->app->bind('ExtendedInput', function()
        {
            return new ExtendedInput;
        });
    }

}

config/app.php

'providers' => [
    'App\App\ExtendedInput\ExtendedInputServiceProvider',
    // ..
],

我通常这样做:

<input name="name" />
{{ $errors->first('name', '<div class="error">:message</div>') }}

它会自动检查错误是否存在并显示出来。 希望这有帮助。