除非你喜欢冒险,否则在 Nova 创建/更新页面上显示的任何 Nova 字段都需要一些验证。值得庆幸的是,将您熟悉的 Laravel 验证规则附加到您的 Nova 资源字段非常容易。让我们开始吧。
在资源上定义字段时,您可以使用 rules
方法将 验证规则 附加到该字段
Text::make('Name')
->sortable()
->rules('required', 'max:255'),
当然,如果您正在利用 Laravel 对 验证规则对象 的支持,您也可以将它们附加到资源
use App\Rules\ValidState;
Text::make('State')
->sortable()
->rules('required', new ValidState),
您也可以通过数组或闭包将规则提供给 rules
方法
// Using an array...
Text::make('State')->rules(['required', new ValidState]),
// Using a Closure...
Text::make('State')->rules(fn ($request) => [
'required',
new ValidState(),
]);
此外,您可以使用 自定义闭包规则 来验证您的资源字段
Text::make('State')
->sortable()
->rules('required', function($attribute, $value, $fail) {
if (strtoupper($value) !== $value) {
return $fail('The '.$attribute.' field must be uppercase.');
}
}),
如果您想定义仅在创建资源时才适用的规则,可以使用 creationRules
方法
Text::make('Email')
->sortable()
->rules('required', 'email', 'max:255')
->creationRules('unique:users,email')
->updateRules('unique:users,email,{{resourceId}}'),
同样,如果您想定义仅在更新资源时才适用的规则,可以使用 updateRules
方法。如果需要,您可以在规则定义中使用 resourceId
占位符。此占位符将自动替换为正在更新的资源的主键
Text::make('Email')
->sortable()
->rules('required', 'email', 'max:255')
->creationRules('unique:users,email')
->updateRules('unique:users,email,{{resourceId}}'),
Nova 还提供了一些方法,允许您在资源验证后执行任务,从而有机会在将资源持久保存到数据库之前执行更多自定义验证
afterValidation
方法 afterValidation
方法将在资源在创建期间或更新期间验证后始终被调用。此方法将在调用 afterCreationValidation
或 afterUpdateValidation
之前被调用
/**
* 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
方法将在创建的资源经过验证后被调用。
/**
* 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
方法将在更新的资源经过验证后被调用。
/**
* 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!');
}
}