为自定义验证规则命名 - 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);
    }