【问题标题】:Custom Rule class in Laravel - how to get message working?Laravel 中的自定义规则类 - 如何让消息正常工作?
【发布时间】:2020-06-02 07:41:12
【问题描述】:

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

我创建了一个新的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;
    }
}

【问题讨论】:

    标签: laravel validation laravel-5.8 laravel-6 laravel-validation


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      编辑:

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

      【讨论】:

        【解决方案3】:

        原来这是与 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

        【讨论】:

          猜你喜欢
          • 2013-12-17
          • 1970-01-01
          • 2018-08-30
          • 1970-01-01
          • 1970-01-01
          • 2023-03-20
          • 1970-01-01
          • 2015-09-07
          • 1970-01-01
          相关资源
          最近更新 更多