【问题标题】:Laravel - validation rule for date on updateLaravel - 更新日期的验证规则
【发布时间】:2016-12-02 21:28:45
【问题描述】:

我有这个验证规则:

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

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

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

更新

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

<?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;
    }
}

【问题讨论】:

  • 您没有两种不同的方法来创建和更新模型吗?如果是这样,只需更改更新中的验证规则。如果您使用相同的验证数组进行创建和更新,您也可以覆盖 event_start 键。

标签: laravel


【解决方案1】:

您应该有不同的表单请求类来创建和更新事件。不过,这并不是说您不能使用继承。

如果您的更新方法与创建方法仅略有不同,那么您可以扩展该方法的表单请求并修改更新规则:

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
    }
}

【讨论】:

  • 如果这是创建还是更新,我可以以某种方式检查我的请求吗? $id = $this-&gt;route('event')-&gt;getKey();是这个吗?
  • @lewis4u 是:您应该有不同的表单请求类来创建和更新事件。
  • 因为一个领域我觉得不值得!我实际上有超过 20 个输入字段,但我没有在这里全部显示!
  • @lewis4u 这就是为什么你应该使用继承。
  • 我刚做了这个if($this-&gt;route('event')) $rules['event_start'] = 'required|date'; 我很满意
【解决方案2】:

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

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

【讨论】:

  • 我已经制作了自己的请求验证器,所以我使用相同的创建和更新。这就是为什么所有的混乱
  • 所以,您仍在进行某种检查以确定这是创建还是更新请求。在这里也使用它。
  • 现在如何在我的请求验证器中做到这一点?
【解决方案3】:

我假设验证规则位于 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
}

【讨论】:

    【解决方案4】:

    使用规则的单一方法检查是否创建或更新并基于该方法返回数组

    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;
    }
    

    【讨论】:

    • 是的,它和我的几乎一样......所以这里没有变化if(\Route::currentRouteName() == 'events.update') $rules['event_start'] = 'required|date'; return $rules; 除了我的代码更少:D
    • 是的,如果您检查路由名称或路由参数,两者都将起作用,当自定义命名路由时,路由名称可能会产生问题,但参数不会产生该问题。 :)
    • 所以最好把if(\Route::currentRouteName() == 'events.update')换成if($this-&gt;route('event'))
    猜你喜欢
    • 2014-07-26
    • 2020-09-13
    • 2014-04-10
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 2020-07-17
    相关资源
    最近更新 更多