为自定义验证规则命名 - Laravel 8

Posted

技术标签:

【中文标题】为自定义验证规则命名 - Laravel 8【英文标题】:Give name to custom validation Rule - Laravel 8 【发布时间】:2021-10-25 13:02:55 【问题描述】:

Laravel 8 使得创建自定义验证规则成为可能:https://laravel.com/docs/8.x/validation#custom-validation-rules

php artisan make:rule Euro

但是你必须将规则作为对象(而不是字符串)传递:

new Euro

而不是常规的字符串表示法

'required|euro'

有没有办法将新的 Rule 类“注册”到一个字符串标识符并像使用现有规则一样使用它们?

【问题讨论】:

你知道它不会改变任何事情(只是让它变慢)来实现这一点。该字符串将用于启动规则类,然后使用。 在某些情况下,您无法使用类实例指定验证规则。因此,这是一个有效的问题。 【参考方案1】:

您可以通过以下方式进行。

在您的规则中创建两个额外的方法,除了默认方法(passes()message()):

handle() -- 这将返回您的规则的字符串句柄。它的唯一目的是在一个地方跟踪该句柄。 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);

使用 Validator 门面或 Service Provider 的 boot() 方法中的工厂注册您的类:


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);
    

就是这样。 如果您创建了专用服务提供商,请不要忘记注册您的服务提供商。

【讨论】:

我目前不再从事我想要的项目,所以我无法试用它。我会假设它可以工作:)【参考方案2】:

您可以在验证器上使用extend 函数。大概是这样的:

Validator::extend('euro', new Euro());

此代码应在您的 AppServiceProvider 中。

【讨论】:

这不起作用。我把dd($value) 放在Europasses() 方法中,它永远不会触发...

以上是关于为自定义验证规则命名 - Laravel 8的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 图像规则验证不适用于 Laravel 8,但适用于 Laravel 7 |拉拉维尔 |图片 |验证

Laravel - 在自定义验证中使用验证规则

在 laravel 中重命名验证响应

Laravel 自定义验证规则

Laravel 5.5 / 验证器 / 自定义规则

Laravel 验证:存在附加列条件 - 自定义验证规则