Laravel 中的自定义规则 class - 如何使消息正常工作?

Custom Rule class in Laravel - how to get message working?

在现有项目上工作,因此保持代码结构与其他开发人员相同至关重要。

我创建了一个新的 Rule 并将我的 Validator::extend 添加到 boot()。但是我无法获得验证错误来显示我的自定义消息。相反只是显示默认 "validation.ruleName"

我正在编写一个使用 ImLiam 的 NHS 号码验证包的验证规则。 validate()passes() 成功运行。但是错误信息永远不会改变。

如何获取messages()方法显示异常的自定义输出? (而不是下面屏幕截图中的 "validation.nhsnumber"?

App\Forms\MyForm:(使用Kris Forms

public function buildForm()
{
    $this->add('nhs_number', 'number', [
        'label' => 'NHS Number',
        'rules' => 'nullable|nhsnumber',
    ]);
    ...
}

App\Providers\AppServiceProvider:

public function boot()
{

        Validator::extend('nhsnumber', \App\Rules\ValidNhsNumber::class);
}

App\Rules\ValidNhsNumber:

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use ImLiam\NhsNumber\InvalidNhsNumberException;
use ImLiam\NhsNumber\NhsNumber;

class ValidNhsNumber implements Rule
{
    private $message;

    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param string $attribute
     * @param mixed $value
     * @return bool
     */
    public function passes($attribute, $value): bool
    {
        try {
            $nhsNumber = new NhsNumber($value);
            $nhsNumber->validate(); // Will throw exception here if false
            return true;
        } catch (InvalidNhsNumberException $e) {
            $this->message = $e->getMessage();
        }
    }

    public function validate($attribute, $value, $params): bool
    {
        return $this->passes($attribute, $value);
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return $this->message;
    }
}

您的消息 属性 为空。 Laravels 验证器将尝试获取调用您的 message() 方法的错误消息,如果没有 returning 它将使用 get_class($this) 然后尝试构建错误消息。

此方法可以 return 翻译占位符,例如 validation.nhsnumber,也可以 return 实际消息。在您给出的示例中,它没有 returning 任何东西。

您是否尝试过转储 $this->message;?如果你转储它会显示什么?你甚至到达 public function message() 了吗?尝试在 message() 方法中添加一个 dd($this-message)

编辑:

在您的 catch 中,您根本没有返回任何东西。当它进入 catch 时,它不会返回 falsetrue。它正在返回 null

原来这是与 KrisForms 的冲突。

但是你可以通过稍微改变你要求它处理规则的方式来获得想要的结果。

App\Forms\MyForm: 我改变了:

$this->add('nhs_number', 'number', [
            'label' => 'NHS Number',
            'rules' => 'nullable|nhsnumber',
]);

为此:

$this->add('nhs_number', 'number', [
            'label' => 'NHS Number',
            'rules' => [
                'nullable',
                new ValidNhsNumber()
            ]
]);

然后确保在 catch 块中我在 passes() 中返回 false