我想将此代码移至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)
如果我正确理解您的需求,则无需扩展验证器。
你似乎有课:
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)
当使用带有 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)
| 归档时间: |
|
| 查看次数: |
2562 次 |
| 最近记录: |