为自定义验证规则命名 - Laravel 8
Give name to custom validation Rule - Laravel 8
Laravel 8 可以创建自定义验证规则:https://laravel.com/docs/8.x/validation#custom-validation-rules
php artisan make:rule Euro
但是你必须将规则作为对象(而不是字符串)传递:
new Euro
而不是常规的字符串表示法
'required|euro'
是否可以将新规则 类“注册”到字符串标识符并像使用现有规则一样使用它们?
您可以在验证器上使用 extend
功能。可能是这样的:
Validator::extend('euro', new Euro());
此代码应该在您的 AppServiceProvider 中。
您可以按照以下方式进行。
除了默认方法(passes()
、message()
)之外,在您的规则中创建另外两个方法:
handle()
-- 这将 return 您的规则的字符串句柄。它的唯一目的是在一个地方跟踪该句柄。
validate()
-- 这是验证器将调用的那个。这实际上应该只是 passes()
的传递,因此您可以将验证逻辑放在一个地方。此外,您应该将消息传递给验证器。在大多数情况下,您还希望将消息逻辑放在一个地方。
use Illuminate\Validation\Validator;
public static function handle(): string
{
return 'euro';
}
public function validate(string $attribute, $value, $params, Validator $validator): bool
{
$handle = $this->handle();
$validator->setCustomMessages([
$handle => $this->message(),
]);
return $this->passes($attribute, $value);
}
使用验证器外观或服务提供商 boot()
方法中的工厂注册您的 class:
namespace App\Providers;
use App\Rules\Euro;
use Illuminate\Contracts\Validation\Factory as ValidatorFactory;
use Illuminate\Support\ServiceProvider;
class ValidationServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot(ValidatorFactory $validator)
{
$validator->extend(Euro::handle(), Euro::class);
}
}
就是这样。
如果您创建了专用服务提供商,请不要忘记注册您的服务提供商。
这个解决方案对我有用。
php artisan make:rule NoLink
App\Rules\NoLink.php
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
use Illuminate\Validation\Validator;
class NoLink implements Rule
{
// ...
public function message()
{
return __('validation.' . self::handle());
}
public static function handle(): string
{
return 'no_link';
}
public function validate(string $attribute, $value, $params, Validator $validator): bool
{
$handle = $this->handle();
$validator->setCustomMessages([
$handle => $this->message(),
]);
return $this->passes($attribute, $value);
}
}
App\Providers\AppServiceProvider.php
public function boot()
{
// ...
Validator::extend(NoLink::handle(), NoLink::class);
}
Laravel 8 可以创建自定义验证规则:https://laravel.com/docs/8.x/validation#custom-validation-rules
php artisan make:rule Euro
但是你必须将规则作为对象(而不是字符串)传递:
new Euro
而不是常规的字符串表示法
'required|euro'
是否可以将新规则 类“注册”到字符串标识符并像使用现有规则一样使用它们?
您可以在验证器上使用 extend
功能。可能是这样的:
Validator::extend('euro', new Euro());
此代码应该在您的 AppServiceProvider 中。
您可以按照以下方式进行。
除了默认方法(passes()
、message()
)之外,在您的规则中创建另外两个方法:
handle()
-- 这将 return 您的规则的字符串句柄。它的唯一目的是在一个地方跟踪该句柄。validate()
-- 这是验证器将调用的那个。这实际上应该只是passes()
的传递,因此您可以将验证逻辑放在一个地方。此外,您应该将消息传递给验证器。在大多数情况下,您还希望将消息逻辑放在一个地方。
use Illuminate\Validation\Validator;
public static function handle(): string
{
return 'euro';
}
public function validate(string $attribute, $value, $params, Validator $validator): bool
{
$handle = $this->handle();
$validator->setCustomMessages([
$handle => $this->message(),
]);
return $this->passes($attribute, $value);
}
使用验证器外观或服务提供商 boot()
方法中的工厂注册您的 class:
namespace App\Providers;
use App\Rules\Euro;
use Illuminate\Contracts\Validation\Factory as ValidatorFactory;
use Illuminate\Support\ServiceProvider;
class ValidationServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot(ValidatorFactory $validator)
{
$validator->extend(Euro::handle(), Euro::class);
}
}
就是这样。 如果您创建了专用服务提供商,请不要忘记注册您的服务提供商。
这个解决方案对我有用。
php artisan make:rule NoLink
App\Rules\NoLink.php
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
use Illuminate\Validation\Validator;
class NoLink implements Rule
{
// ...
public function message()
{
return __('validation.' . self::handle());
}
public static function handle(): string
{
return 'no_link';
}
public function validate(string $attribute, $value, $params, Validator $validator): bool
{
$handle = $this->handle();
$validator->setCustomMessages([
$handle => $this->message(),
]);
return $this->passes($attribute, $value);
}
}
App\Providers\AppServiceProvider.php
public function boot()
{
// ...
Validator::extend(NoLink::handle(), NoLink::class);
}