簡體   English   中英

Laravel 自定義規則的自定義驗證錯誤信息

[英]Laravel custom rule's custom validation error message

我有一個自定義規則,它是我使用規則對象制作的,它工作正常,除了一件事,它不會獲取我在組件中為它創建的自定義驗證消息,而是選擇在驗證中分配給它的任何內容.php 文件或翻譯后的 validation.php 文件的等效翻譯。 其他非自定義規則按預期與同一字段的自定義消息一起工作。

組件:

public function rules()
    {
        return[
            'topic' => ['required', 'string', 'max:250', 'min:5', new Profane],
            'name' => ['required', 'string', 'max:250'],
            'email' => ['required', 'email:rfc,dns', 'max:250']
        ];
    }

protected $messages = [
        'topic.required' => 'some message',
        'topic.max' => 'some message',
        'topic.min' => 'some message',
-->     'topic.profane' => 'some message',
        'name.required' => 'some message',
        'name.max' => 'some message.',
        'email.email' => 'some message',
        'email.required' => 'some message',
    ];

規則 object:

public function passes($attribute, $value)
    {
        $profane = ProfaneWord::all();
        $words = $profane->pluck('word');
        foreach ($words as $word)
        {
            if (stripos($value, $word) !== false) return false;
        }
        return true;
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return trans('validation.profane');
    }

使用自定義規則時,這目前似乎不可能。 消息源中的問題只能從message()方法中檢索到。 但是,由於驗證規則是您自己的類,您可以隨時更改它:

    private $message; 
    public __construct($message = null) {
       $this->message = $message;
    }

    public function passes($attribute, $value)
    {
        $profane = ProfaneWord::all();
        $words = $profane->pluck('word');
        foreach ($words as $word)
        {
            if (stripos($value, $word) !== false) return false;
        }
        return true;
    }

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

正如@apokryfos 的評論所建議的那樣,並在 Laravel 9 (v9.30.1) 上進行了測試,可以使用完整的 class 名稱覆蓋自定義驗證規則消息。 下面的示例來自 FormRequest 用法。

public function messages(): array
{
    return [
        'topic.required' => 'some message',
        // ... other rules
        'topic.'.Profane::class => 'The :attribute can not contain ...',
    ];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM