proengsoft/laravel-jsvalidation 如何使用自定义规则消息?

Posted

技术标签:

【中文标题】proengsoft/laravel-jsvalidation 如何使用自定义规则消息?【英文标题】:proengsoft/laravel-jsvalidation How to use Custom Rule Messages? 【发布时间】:2018-08-30 18:48:13 【问题描述】:

我将proengsoft/laravel-jsvalidation 与我通过服务提供者中的Validator::extend(...) 定义的自定义FormRequest 和自定义验证规则结合使用。这很好用。

但是,当我将自定义规则移植到 Laravel 5.5+ 中的新(ish)自定义 Rule 类时,JsValidator 无法获取我的自定义规则消息。

我有这个自定义规则:

use Illuminate\Contracts\Validation\Rule;

class MyRule implements Rule 

    public function passes($attribute, $value) 
        return $value > 10;
    
    public function message() 
        return 'Your :attribute is pretty small, dawg!';
    

我的表单请求使用此规则:

use Illuminate\Foundation\Http\FormRequest;
use App\Rules\MyRule;

class MyRequest extends FormRequest 

    public function authorize() 
        return true;
    
    public function rules() 
        $rules = [
            'foo' => 'required|numeric',
            'bar' => ['required', new MyRule()],
        ];
        return $rules;
    

这应该可以,但是我得到了一个异常

!! JsValidator::formRequest('\App\Http\Requests\MyRequest') !!

Proengsoft\JsValidation\javascript\MessageParser.php 调用 Str::snake(Object(App\Rules\MyRule)) 引发异常。

JsValidation在调用Validator之前不看$rule对象类型->getMessage($attribute, $rule) 相反,它应该调用 $rule->messages();

我能否以某种方式解决此错误,并将 laravel-jsvalidation 与我的自定义 Rule 和 FormRequest 一起使用 - 或者它是否一定需要我提出拉取请求并希望它会被修复......有一天?我想现在就完成这项工作。

【问题讨论】:

【参考方案1】:

这可以通过传递基于规则和消息数组的JsValidator实例来归档,而不是传递表单请求。在控制器中将此实例传递给刀片。阅读here了解更多详情。

JsValidator::make($rules, $messages, $customAttributes, $selector)

在控制器中,

$validator = JsValidator::make(
    [
        'name' => 'required',
    ],
    [
        'name.required' => 'Name field is a required field',
    ]
)

return View::make("Your view", compact($validator));

在刀片中,

!! $validator->selector('.wizard_frm') !!

<form class='wizard_frm'></form>

在这种情况下,我们可以创建请求类的对象并将规则函数返回的数组传递给JsValidator::make(如果需要)。

【讨论】:

以上是关于proengsoft/laravel-jsvalidation 如何使用自定义规则消息?的主要内容,如果未能解决你的问题,请参考以下文章