如何在Laravel Rule中传递参数?

Sha*_*rix 5 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;
});
Run Code Online (Sandbox Code Playgroud)

因此应该是这样的:

//in: App\Rules\EmptyIf

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

但是我的问题是,我不能通过$参数

Validator::extend('empty_if', 'App\Rules\EmptyIf@passes');
Run Code Online (Sandbox Code Playgroud)

您如何将参数传递给Laravel Rule?

小智 10

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

验证调用:

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

规则:

<?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;
}
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以在规则中使用构造函数传递参数

public function __construct($params)
{
    $this->params = $params;
}
Run Code Online (Sandbox Code Playgroud)

然后访问pass方法中的参数

public function passes($attribute, $value)
{
  //access params with $this->params
}
Run Code Online (Sandbox Code Playgroud)


apo*_*fos 5

如果我正确理解您的需求,则无需扩展验证器。

你似乎有课:

class EmptyIf extends Rule {
      public function passes($attribute, $value, $parameters) { }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以把它用作:

$this->validate($data, [ "entry" => [ new EmptyIf() ] ]);
Run Code Online (Sandbox Code Playgroud)

您可以使用以下两种方法:

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


cwe*_*ske 5

当使用带有 required 的规则类时$parameters,你会得到一个错误:

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

您可以简单$parameters地将其设为可选,您将自动获得 Laravel 5.5+ 中传递的参数:

public function passes($attribute, $value, $parameters = [])
{
    //do something here
}
Run Code Online (Sandbox Code Playgroud)