【问题标题】:Laravel conditional validation does not workLaravel 条件验证不起作用
【发布时间】:2018-01-20 01:58:15
【问题描述】:

我有一个包含这些字段的表单:
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; });

再一次,没有显示错误。

订单状态肯定是2。

我也试过了:

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

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

【问题讨论】:

    标签: validation laravel-5.4


    【解决方案1】:

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

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

    传递给闭包的 $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();
    

    【讨论】:

    • 非常感谢。我确实阅读了文档,但没有完全理解您提到的那部分。
    猜你喜欢
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多