如何在Laravel规则中传递参数?

时间:2018-05-04 11:36:53

标签: laravel

我想将此代码移至App \ Rule:

//Currently in class AppServiceProvider extends ServiceProvider

Validator::extend('empty_if', function ($attribute, $value, $parameters, $validator) {
   return ($value != '' && request($parameters[0]) != '') ? false : true;
});

所以它应该是这样的:

//in: App\Rules\EmptyIf

public function passes($attribute, $value, $parameters)
{
   return ($value != '' && request($parameters[0]) != '') ? false : true;
}

但我的问题是,我无法通过

传递$参数
Validator::extend('empty_if', 'App\Rules\EmptyIf@passes');

如何将参数传递给Laravel规则?

5 个答案:

答案 0 :(得分:3)

使用包含所需$parameters的规则类时,您会收到错误消息:

PHP Fatal error:
Declaration of App\Rules\AgeAt::passes($attribute, $value, $parameters)
must be compatible with Illuminate\Contracts\Validation\Rule::passes($attribute, $value)

您可以简单地使$parameters成为可选项,您将自动获取Laravel 5.5+中传递的参数:

public function passes($attribute, $value, $parameters = [])
{
    //do something here
}

答案 1 :(得分:3)

这是完成此操作的一种更简单且更新的方法,而无需扩展验证程序。您可以在Rule的构造函数中访问传递的参数,因此只需设置一个全局范围的变量,现在就可以在passs()方法中引用它。您甚至可以使用相同的方法在验证器消息中包含值。

验证呼叫:

case 'measurement':
 $request->validate([
   'updates.*.value' => [
   new Measurement('foo-bar'),
   ],
 ]);
 break;

规则:

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class Measurement implements Rule
{
/**
 * Create a new rule instance.
 *
 * @param $param
 */
public function __construct($param)
{
    $this->type = $param;
}

public $type;
/**
 * Determine if the validation rule passes.
 *
 * @param string $attribute
 * @param mixed $value
 * @param array $parameters
 * @return bool
 */
public function passes($attribute, $value)
{
    dd($this->type, 'params');
    return;
}

答案 2 :(得分:1)

如果我理解你的需要,你就不需要扩展验证器。

你似乎有课:

class EmptyIf extends Rule {
      public function passes($attribute, $value, $parameters) { }
}

然后您可以将其用作:

$this->validate($data, [ "entry" => [ new EmptyIf() ] ]);

您可以使用以下两种方式进行:

Validator::extend('empty_if', function ($attribute, $value, $parameters) {
    return (new EmptyIf())->passes($atribute, $value, $parameters);
 });

答案 3 :(得分:1)

您可以通过规则

中的构造函数传递参数
public function __construct($params)
{
    $this->params = $params;
}

然后通过方法中的访问参数

public function passes($attribute, $value)
{
  //access params with $this->params
}

答案 4 :(得分:0)

您可以通过将参数传递到Rule的构造函数中来实现:

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use Illuminate\Http\Request;

class EmptyIf implements Rule
{
    public $otherParameter;

    public function passes($attribute, $value)
    {
        if (Request::get($this->otherParameter) != '') {
            return ($value == '');
        }

        return true;
    }

    public function message()
    {
        return 'The :attribute cannot be empty if ' . $this->otherParameter . ' is set';
    }
}

在服务提供商中:

<?php

namespace App\Providers;

use App\Rules\EmptyIf;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap services.
     */
    public function boot(): void
    {
        Validator::extend('empty_if', function($attribute, $value, $parameters, $validator) {
            $rule = new EmptyIf($parameters[0]);

            return $rule->passes();
        });
    }
}

因此,现在您可以在验证器中使用字符串形式:

'sometimes|nullable|empty_if:about_image|max:200|url'