Laravel条件验证不起作用

时间:2017-08-11 14:00:09

标签: validation laravel-5.4

我有一个包含这些字段的表单:
shipping_method (hidden field with value="2" in my testing case)
courier_id
tracking_no
delivery_date

仅当shipping_method为2

时才需要courier_id字段
<div class="form-group{{ $errors->has('courier_id') ? ' has-error' : ''}}">
    <label>Courier</label>

    <select name="courier_id" class="form-control">
        <option value="">Select...</option>
        @foreach($couriers as $courier)
            <option value="{{ $courier->id }}">{{ $courier->name }}</option>
        @endforeach
    </select>

    @if ($errors->has('courier_id'))
    <span class="help-block">
        <strong>{{ $errors->first('courier_id') }}</strong>
    </span>
    @endif
</div>

在我的控制器中:

public function update(Request $request, $id)
{
    $delivery_date = Null;
    $courier_id = Null;
    $order = Order::findOrFail($id);
    $status = 0;

    if($order->status == 2) {
        $status = 3;
        $courier_id = $request->courier_id;

        $messages = [ 'courier_id.required' => 'Please select a courier'];

        $v = Validator::make(Input::all(), [
            'tracking_no' => 'required',
            'delivery_date' => 'required|date_format:d/m/Y'
        ], $messages)->validate();

        $v->sometimes('courier_id', 'required', function (Request $request) {
          return true;
            //return $request->shipping_method == 2;
        });

即使courier_id为空,我也没有得到错误。

我有三个问题:

  1. 为什么即使我在有时检查时返回true,我也没有收到错误

  2. 不确定我应该发送给有时检查的参数是什么,是Request $ request吗?

  3. 我尝试将订单发送到有时检查而不是请求,因此我不必在表单上有一个隐藏字段,例如

    $v->sometimes('courier_id', 'required', function ($order) { return $order->shipping_method == 2; });

  4. 同样,没有显示错误。

    订单状态肯定是2。

    我也尝试过:

     $v->sometimes('courier_id', 'required', function ($order) {
            return $order->shipping_method == '2';
         });
    

    如果我删除了有时检查,只需根据需要添加courier_id验证,我就会在表单上收到错误。

1 个答案:

答案 0 :(得分:1)

您在验证数据后添加条件规则,从而使验证者不了解该规则。这应该回答你的第一个问题

对于您的问题2,3,该文件指出

  

传递给Closure的$ input参数将是Illuminate \ Support \ Fluent的一个实例,可用于访问您的输入和文件。

首先将自定义规则添加到验证程序。然后验证数据。

$v = Validator::make(Input::all(), [
    'tracking_no' => 'required',
    'delivery_date' => 'required|date_format:d/m/Y'
], $messages);

$v->sometimes('courier_id', 'required', function (Request $request) {
    return $request->shipping_method == 2;
});

$v->validate();

您应该可以在没有条件规则的情况下执行此操作。

您可以将以下内容添加到应验证的现有规则集

'courier_id' => 'required_if:shipping_method,2'

所以你的验证应该是

$v = Validator::make(Input::all(), [
    'tracking_no' => 'required',
    'delivery_date' => 'required|date_format:d/m/Y',
    'courier_id' => 'required_if:shipping_method,2'
], $messages)->validate();