输入验证异或

Cha*_*ynn 4 php laravel laravel-4 laravel-validation

我有一个名为“答案”的模型。

该模型有两种可能的关系。一个Question或一个Product。但是,Answer 应该只具有一种关系。问题或产品。

有一个表格可以创建答案。

该表单具有三个输入。其中两个是<select>输入。另一个是文本输入,称为名称。

我希望我的验证只允许填写一项。

我当前的验证:

$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);
});
Run Code Online (Sandbox Code Playgroud)

要求至少填写其中一项,但也允许填写两项。

所以,我的问题是:如何更改验证以仅允许填写其中一项选择。但其中一项必须始终填写。

选择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>
Run Code Online (Sandbox Code Playgroud)

选择2:

<select name="product" class="form-control">
    <option>None</option>
    <option value="2" selected="selected">Product 1</option>
    <option value="3">Product 2</option>
</select>
Run Code Online (Sandbox Code Playgroud)

dam*_*ani 5

@Razor 的自定义 XOR 验证规则非常好,但是如果您不想创建自定义规则,还有另一条路线。您可以使用 添加值来Input表示您的约束Input::merge,然后使用这些值进行验证:

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.'         
    )
);
Run Code Online (Sandbox Code Playgroud)

您仍然应该将表单中的空值更改为<option value=''>None</option>。

与使用 XOR 比较不同,此方法允许您针对无值与两个值返回单独的错误消息,而无需任何进一步的错误检查。