我想将此代码移至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规则?
答案 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'