logo

验证

除非你喜欢冒险,否则在 Nova 创建/更新页面上显示的任何 Nova 字段都需要一些验证。值得庆幸的是,将您熟悉的 Laravel 验证规则附加到您的 Nova 资源字段非常容易。让我们开始吧。

规则

附加规则

在资源上定义字段时,您可以使用 rules 方法将 验证规则 附加到该字段

php
Text::make('Name')
    ->sortable()
    ->rules('required', 'max:255'),

当然,如果您正在利用 Laravel 对 验证规则对象 的支持,您也可以将它们附加到资源

php
use App\Rules\ValidState;

Text::make('State')
    ->sortable()
    ->rules('required', new ValidState),

您也可以通过数组或闭包将规则提供给 rules 方法

php
// Using an array...
Text::make('State')->rules(['required', new ValidState]),

// Using a Closure...
Text::make('State')->rules(fn ($request) => [
    'required', 
    new ValidState(),
]);

此外,您可以使用 自定义闭包规则 来验证您的资源字段

php
Text::make('State')
    ->sortable()
    ->rules('required', function($attribute, $value, $fail) {
        if (strtoupper($value) !== $value) {
            return $fail('The '.$attribute.' field must be uppercase.');
        }
    }),

创建规则

如果您想定义仅在创建资源时才适用的规则,可以使用 creationRules 方法

php
Text::make('Email')
    ->sortable()
    ->rules('required', 'email', 'max:255')
    ->creationRules('unique:users,email')
    ->updateRules('unique:users,email,{{resourceId}}'),

更新规则

同样,如果您想定义仅在更新资源时才适用的规则,可以使用 updateRules 方法。如果需要,您可以在规则定义中使用 resourceId 占位符。此占位符将自动替换为正在更新的资源的主键

php
Text::make('Email')
    ->sortable()
    ->rules('required', 'email', 'max:255')
    ->creationRules('unique:users,email')
    ->updateRules('unique:users,email,{{resourceId}}'),

验证后钩子

Nova 还提供了一些方法,允许您在资源验证后执行任务,从而有机会在将资源持久保存到数据库之前执行更多自定义验证

afterValidation 方法

afterValidation 方法将在资源在创建期间或更新期间验证后始终被调用。此方法将在调用 afterCreationValidationafterUpdateValidation 之前被调用

php
/**
 * Handle any post-validation processing.
 *
 * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
 * @param  \Illuminate\Validation\Validator  $validator
 * @return void
 */
protected static function afterValidation(NovaRequest $request, $validator)
{
    if (self::somethingElseIsInvalid()) {
        $validator->errors()->add('field', 'Something is wrong with this field!');
    }
}

afterCreationValidation 方法

afterCreationValidation 方法将在创建的资源经过验证后被调用。

php
/**
 * Handle any post-creation validation processing.
 *
 * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
 * @param  \Illuminate\Validation\Validator  $validator
 * @return void
 */
protected static function afterCreationValidation(NovaRequest $request, $validator)
{
    if (self::somethingElseIsInvalid()) {
        $validator->errors()->add('field', 'Something is wrong with this field!');
    }
}

afterUpdateValidation 方法

afterUpdateValidation 方法将在更新的资源经过验证后被调用。

php
/**
 * Handle any post-update validation processing.
 *
 * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
 * @param  \Illuminate\Validation\Validator  $validator
 * @return void
 */
protected static function afterUpdateValidation(NovaRequest $request, $validator)
{
    if (self::somethingElseIsInvalid()) {
        $validator->errors()->add('field', 'Something is wrong with this field!');
    }
}