2016-11-28 68 views
2

日期验证规则我有这样的验证规则:Laravel - 上更新

'event_start' => 'required|date|after:today', 

和创建模型一切都很好,这个日期不能早于今天....

但是当一个用户尝试更新事件开始日期是在今天之前,弹出一个验证错误....有没有办法调整这个更新模型?所以当用户更新这个规则时只会检查它是否是一个日期?

UPDATE

这是我唯一的验证检查都创建和更新:

<?php 

namespace App\Http\Requests; 

use Illuminate\Foundation\Http\FormRequest; 

class EventsForm extends FormRequest 
{ 
    /** 
    * Determine if the user is authorized to make this request. 
    * 
    * @return bool 
    */ 
    public function authorize() 
    { 
     if(auth()->check()) 
     return true; 
    } 

    /** 
    * Get the validation rules that apply to the request. 
    * 
    * @return array 
    */ 
    public function rules() 
    { 
     $rules = [ 

      'title' => 'required|min:2|max:255', 
      'event_start' => 'required|date|after:today', 

     ]; 

     return $rules; 
    } 
} 
+0

你没有创建和更新模型两种不同的方法创建或更新并返回数组?如果是这样,只需更改更新中的验证规则即可。如果您使用相同的验证数组进行创建和更新,则可以覆盖'event_start'键。 – AntoineB

回答

6

你应该有创建和更新活动形式不同请求类。但这并不是说你不能使用继承。

如果您的更新方法只稍微从创建方法不同,则可以延长该法的形式要求和修改规则更新:

class CreateEventRequest extends FormRequest 
{ 
    public function authorize() 
    { 
     return true; 
    } 

    public function rules() 
    { 
     return [ 
      'name' => 'required|unique:events', 
      'start_date' => 'required|date|after:today', 
      'door_time' => 'required|date_format:"H:i:s", 
      'location' => 'required', 
     ]; 
    } 
} 

而且......

class UpdateEventRequest extends CreateEventRequest 
{ 
    public function rules() 
    { 
     // Get ID of event if using route–model binding 
     $id = $this->route('event')->getKey(); 

     // Use array merge to override create event form request’s rules 
     return array_merge(parent::rules(), [ 
      'name' => 'required|unique:events,name,'.$id, 
      'start_date' => 'required|date', 
     ]); 
    } 
} 

您甚至可以将规则方法推送到抽象类,并让您的创建和更新表单请求类扩展类:

abstract class EventFormRequest extends FormRequest 
{ 
    public function authorize() 
    { 
     return true; 
    } 

    public function rules() 
    { 
     // Base event rules 
    } 
} 

class CreateEventRequest extends EventFormRequest 
{ 
    public function rules() 
    { 
     // Create-specific rules 
    } 
} 

class UpdateEventRequest extends EventFormRequest 
{ 
    public function rules() 
    { 
     // Update-specific rules 
    } 
} 
+0

我可以以某种方式检查我的请求,如果这是一个创建或更新? '$ id = $ this-> route('event') - > getKey();'是这个吗? – lewis4u

+0

@ lewis4u是:**你应该有不同的表单请求类来创建和更新事件。** –

+0

因为一个字段,我认为这不值得!我实际上有超过20个输入字段,但我没有在这里显示它们! – lewis4u

1

如果创建和更新逻辑是不同的,只是使用不同的验证规则为每个方法:

'event_start' => 'required|date|after:today', // For creating 
'event_start' => 'required|date', // For updating 
+0

我已经提出了自己的请求验证器,所以我使用相同的方法来创建和更新。这就是为什么所有的混乱 – lewis4u

+0

所以,你仍然在做一些检查detemrine这是一个创建或更新请求。在这里也使用它。 –

+0

我将更新我的问题 – lewis4u

0

我认为你有共同的插入和更新方法,在这种情况下做两个不同的验证,如:

张贴在隐藏字段定义,如果它是一个插入请求或更新

if($req_type == 'insert') 
{ 
    'event_start' => 'required|date|after:today', // For creating 
} 
else if($req_type == 'update') 
{ 
    'event_start' => 'required|date', // For updating 
} 
+0

是的我有一个用于创建和更新...所以显然这不会工作....我需要将它们分开 – lewis4u

1

我假设的验证规则位于HttpRequest的一个值,那么你可以更改验证规则是:

'event_start' => 'required|date', 

而且您的控制器上:

public function store(EventRequest $request) 
{ 
     $validator = Validator::make($request->all(), [ 
      'event_start' => 'date|after:today', 
     ]); 

     if($validator->fails()) 
     { 
      return redirect('event/create') 
        ->withErrors($validator) 
        ->withInput(); 
     } 

     // Save the event 
} 
+0

是的,你是对的....我不知道谁的答案接受... – lewis4u

0

使用规则的单一的方法来检查,如果基于该

public function rules() 
{ 
    $rules = [ 

     'title' => 'required|min:2|max:255', 
     'event_start' => 'required|date|after:today', 

    ]; 
    // $this->route('event') will be null if its create so the defualt one is ok 
    if($this->route('event')) { 
     // modify rules for edit here 
     $rules['event_start'] => 'required|date'; 
     $rules['name'] => 'required|unique:events,name,'.$this->route('event')->id; 
     // above rules will only be applied if update. 
    } 

    return $rules; 
} 
+0

是啊它几乎和我的一样....所以这里没有改变if(\ Route :: currentRouteName()=='events.update') $ rules ['event_start'] ='必需|日期“; 返回$规则; '除了我的代码少了:D – lewis4u

+0

是的,如果你检查路由名或路由参数,路由名会在定制命名路由时产生问题,但params不会产生这个问题。 :) –

+0

所以它更好,如果我改变'if(\ Route :: currentRouteName()=='events.update')'这个'if($ this-> route('event'))'' – lewis4u