我有一个包含这些字段的表单:
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为空,我也没有得到错误。
我有三个问题:
为什么即使我在有时检查时返回true,我也没有收到错误
不确定我应该发送给有时检查的参数是什么,是Request $ request吗?
我尝试将订单发送到有时检查而不是请求,因此我不必在表单上有一个隐藏字段,例如
$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
验证,我就会在表单上收到错误。
答案 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();