Php 输入验证异或
我有一个模型叫做答案 这个模型有两种可能的关系。Php 输入验证异或,php,laravel,laravel-4,laravel-validation,Php,Laravel,Laravel 4,Laravel Validation,我有一个模型叫做答案 这个模型有两种可能的关系。问题或产品。 但是,答案应该只有一个关系。问题或产品 有一个表格可以创建答案 此表单有三个输入。其中两个是输入。另一个是文本输入,称为name 我希望我的验证只允许填写一个 我当前的验证: $validator = Validator::make( Input::all(), array('name' => array('required')) ); $validator->sometimes('product', a
问题
或产品
。
但是,答案应该只有一个关系。问题或产品
有一个表格可以创建答案
此表单有三个输入。其中两个是
输入。另一个是文本输入,称为name
我希望我的验证只允许填写一个
我当前的验证:
$validator = Validator::make(
Input::all(),
array('name' => array('required'))
);
$validator->sometimes('product', array('required', 'numeric'), function ($input) {
return !is_numeric($input->question);
});
$validator->sometimes('question', array('required', 'numeric'), function ($input) {
return !is_numeric($input->product);
});
Input::merge(array(
'hasBoth' => Input::has('product') && Input::has('question'),
'hasNeither' => !Input::has('product') && !Input::has('question')
));
$validator = Validator::make(
Input::all(), array(
'name' => 'required',
'hasNeither' => 'size:0',
'hasBoth' => 'size:0',
), array(
'hasNeither.size' => 'A question or a product is required.',
'hasBoth.size' => 'You cannot choose both a question and a product.'
)
);
需要至少填写一个所选项目,但也允许填写两个
所以,我的问题是:如何更改我的验证以只允许填写其中一个选项。
但其中一项必须始终填写
选择1:
<select name="question" class="form-control">
<option>None</option>
<option value="1" selected="selected">Question 1</option>
<option value="2">Question 2</option>
</select>
<select name="product" class="form-control">
<option>None</option>
<option value="2" selected="selected">Product 1</option>
<option value="3">Product 2</option>
</select>
没有一个
问题1
问题2
选择2:
<select name="question" class="form-control">
<option>None</option>
<option value="1" selected="selected">Question 1</option>
<option value="2">Question 2</option>
</select>
<select name="product" class="form-control">
<option>None</option>
<option value="2" selected="selected">Product 1</option>
<option value="3">Product 2</option>
</select>
没有一个
产品1
产品2
不带的所需\u可能就是您想要的:
只有当任何其他字段
指定的字段不存在
首先将question
字段设置为required\u,不带:product
,将product
字段设置为required\u,不带:question
。必须在“无”选项中指定空值:
@Razor的自定义XOR验证规则非常好,但是如果您不想创建自定义规则,还有另一种方法。您可以使用Input::merge
将表示约束的值添加到Input
,然后使用这些值进行验证:
$validator = Validator::make(
Input::all(),
array('name' => array('required'))
);
$validator->sometimes('product', array('required', 'numeric'), function ($input) {
return !is_numeric($input->question);
});
$validator->sometimes('question', array('required', 'numeric'), function ($input) {
return !is_numeric($input->product);
});
Input::merge(array(
'hasBoth' => Input::has('product') && Input::has('question'),
'hasNeither' => !Input::has('product') && !Input::has('question')
));
$validator = Validator::make(
Input::all(), array(
'name' => 'required',
'hasNeither' => 'size:0',
'hasBoth' => 'size:0',
), array(
'hasNeither.size' => 'A question or a product is required.',
'hasBoth.size' => 'You cannot choose both a question and a product.'
)
);
您仍然应该将表单中的空值更改为None
与使用异或比较不同,此方法允许您针对无值和两个值返回单独的错误消息,而无需进一步的错误检查。这将使验证工作与当前类似。这意味着用户仍然可以同时选择这两个选项,并且验证将通过。我可以在控制器中有额外的逻辑来处理这个问题并选择一个,但我真的不想采用这种方法。我希望我能找到一种验证方法来处理它。非常好的解决方法,我喜欢。但是,它是不可重用的。另外,通过XOR比较,您可以返回单独的错误消息,检查我的编辑(我得到您的消息:p)。如果@charliepryn不需要在其他形式中重用此逻辑,那么您的答案可能是最好的。是的,如果需要的话,它不容易重用。但是,如果重用性是必要的,我认为将相同的逻辑抽象出来,将输入分组在一起,并测试是否存在所有输入,或者是否存在任何输入,并将其放入一个自定义验证器类中是有意义的。我可以设想一个类似于'group'=>'hasAll:product,question,other'
和'group'=>'hasNone:product,question,other'
的结构,它将处理输入::合并部分中的逻辑。通过这种方式,您仍然可以轻松地独立测试两个条件,也可以独立地为每个条件设置自定义错误消息。考虑到这一点,最好将Validator类扩展为包含“has”功能,该功能将接受一个数组或字段列表,然后将其作为一个组进行验证,例如:'product,question,other'=>'hassother:0'
或'haslessen:2'
/'hassbetween:0,2'
/'has:all'
/'has:none'
/'has:5'
,等等。这样,您就可以完全控制错误消息,并且逻辑可以用于任何数量的字段。在@charliepryn的例子中,您将运行'product,question'=>'hasmore:0 | hasLessThan:2'
,并能够为每个条件返回单独的错误消息。第一个闭包(又称匿名函数)中的逻辑可以合并和缩减。我已经相应地编辑了你的答案。也可以考虑使用“新”数组样式<代码> []/COD>。