有没有办法在custom \ Illuminate \ Contracts \ Validation \ Rule中使用参数

时间:2018-01-24 13:24:46

标签: php laravel laravel-5 laravel-5.5 laravel-validation

Laravel中here的一种方法是调用Artisan方法enum class e_mode : bool;

make:rule

然后我不知道如何处理参数。 “参数”表示php artisan make:rule EmptyIf 之类的内容。 require_if:foo,bar接口只有\Illuminate\Contracts\Validation\Rule函数的两个参数:

passes

所以我无法理解我应该在哪里添加参数。我知道我可以通过服务提供商扩展验证器,就像这样:

public function passes($attribute, $value);

但这似乎是一种古老的方式,而且在我看来有点混乱。有没有办法处理Validator::extend('foo', function ($attribute, $value, $parameters, $validator) { // }); 的{​​{1}}函数中的参数?

2 个答案:

答案 0 :(得分:1)

您可以为自定义规则定义构造函数,然后在自定义规则对象中传递参数。 自定义规则:

class CustomRule implements Rule
{
    private $params = [];

    public function __construct($params)
    {
        $this->params = $params;
    }    

    public function passes($attribute, $value)
    {
        return /*Here you can use $this->params*/;
    }
}

<强>验证

$request->validate([
    'input' => ['rule', new CustomRule(['param1','param2','paramN'])],
]);

答案 1 :(得分:0)

我想做这样的事情:

protected $validationRules = [
        'name' => 'required|myRule:a,b',
];

我从服务提供商book()方法内部调用规则:

Validator::extend(
    'myRule',
    function ($attribute, $value, $parameters, $validator) {
        $rule = new MyRule();
        $rule->setA($parameters[0])
            ->setB($parameters[1]);
        return $rule->passes($attribute, $value);
    },
    MyRule::errorMessage()
);

规则如下:

use Illuminate\Contracts\Validation\Rule;

/**
 * Check if an encoded image string is a valid image
 */
class EncodedImage implements Rule
{
    public function setA($a){}
    public function setB($b){}

    public function passes($attribute, $value)
    {
        return true;
    }

    public function message()
    {
        return self::errorMessage();
    }

    /**
     * Static so the ServiceProvider can read it.
     */
    public static function errorMessage()
    {
        return 'The :attribute is not valid';
    }
}