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

问题描述 投票:0回答:2

处理现有项目,因此使代码结构与其他开发人员相同是至关重要的。

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

我正在编写使用ImLiam的NHS Number验证包的验证规则。 validate()passes()成功工作。但是错误消息永远不会改变。

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

enter image description here

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;
    }
}
laravel validation laravel-5.8 laravel-6 laravel-validation
2个回答
0
投票

您的邮件属性为空。 Laravels验证器将尝试获取调用您的message()方法的错误消息,如果未返回任何内容,它将使用get_class($this),然后尝试构造错误消息。

此方法可以返回翻译占位符,例如validation.nhsnumber,也可以返回实际的消息。在您给出的示例中,它只是不返回任何内容。


0
投票

您是否尝试转储$this->message;?如果转储它会显示什么?您甚至到达public function message()吗?尝试将dd($this-message)放在message()方法中。

编辑:

catch中,您什么也不返回。输入catch时,不会返回falsetrue。返回null

© www.soinside.com 2019 - 2024. All rights reserved.