【发布时间】:2015-08-18 13:59:26
【问题描述】:
我有两个字段,即数字和百分比。我希望用户只在一个输入字段中输入值。如果用户在数字和百分比字段中输入值,系统应该抛出验证错误。我们可以用 laravel 验证做些什么来实现这一点吗?
谢谢。
【问题讨论】:
标签: php validation laravel
我有两个字段,即数字和百分比。我希望用户只在一个输入字段中输入值。如果用户在数字和百分比字段中输入值,系统应该抛出验证错误。我们可以用 laravel 验证做些什么来实现这一点吗?
谢谢。
【问题讨论】:
标签: php validation laravel
您可以为此编写自定义验证器: http://laravel.com/docs/5.0/validation#custom-validation-rules
它可能看起来像这样:
class CustomValidator extends Illuminate\Validation\Validator {
public function validateEmpty($attribute, $value)
{
return ! $this->validateRequired($attribute, $value);
}
public function validateEmptyIf($attribute, $value, $parameters)
{
$key = $parameters[0];
if ($this->validateRequired($key, $this->getValue($key))) {
return $this->validateEmpty($attribute, $value);
}
return true;
}
}
在服务提供商处注册:
Validator::resolver(function($translator, $data, $rules, $messages, $attributes)
{
return new CustomValidator($translator, $data, $rules, $messages, $attributes);
});
使用它(例如在表单请求中):
class StoreSomethingRequest extends FormRequest {
// ...
public function rules()
{
return [
'percentage' => 'empty_if:number',
'number' => 'empty_if:percentage',
];
}
}
更新 刚刚在 Tinker 中测试过:
Validator::make(['foo' => 'foo', 'bar' => 'bar'], ['bar' => 'empty_if:foo'])->fails()
=> true
Validator::make(['foo' => '', 'bar' => 'bar'], ['bar' => 'empty_if:foo'])->fails()
=> false
Validator::make(['foo' => '', 'bar' => 'bar'], ['foo' => 'empty_if:bar'])->fails()
=> false
【讨论】:
这也是一个很好的解决方案:
return [
'video' => [
'bail',
function ($attribute, $value, $fail) {
if (request()->has($attribute) === request()->filled('videourl')) {
return $fail('Only 1 of the two is allowed');
}
},
'file',
],
'videourl' => [
'bail',
function ($attribute, $value, $fail) {
if (request()->has($attribute) === request()->filled('video')) {
return $fail('Only 1 of the two is allowed');
}
},
]
【讨论】: