Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 输入验证异或_Php_Laravel_Laravel 4_Laravel Validation - Fatal编程技术网

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>。