Laravel - 更新日期的验证规则

3

我有这个验证规则:

'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 键。 - AntoineB
4个回答

7

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

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

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',
        ];
    }
}

And…

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->route('event')->getKey(); 这是吗? - lewis4u
@lewis4u 是的:你应该为创建和更新事件拥有不同的表单请求类。 - Martin Bean
因为一个字段,我认为这不值得!实际上我有超过20个输入字段,但我没有在这里展示它们全部! - lewis4u
1
@lewis4u 这就是为什么你应该利用继承。 - Martin Bean
我刚刚写了这个代码 if($this->route('event')) $rules['event_start'] = 'required|date'; 我很满意。 - lewis4u

2
如果创建和更新逻辑不同,只需为每种方法使用不同的验证规则:
'event_start' => 'required|date|after:today', // For creating
'event_start' => 'required|date', // For updating

我已经制作了自己的请求验证器,因此我在创建和更新时使用相同的验证器。这就是所有混淆的原因。 - lewis4u
所以,你仍然在进行某种检查来确定这是一个创建还是更新请求。在这里也使用它。 - Alexey Mezenin
现在如何在我的请求验证器中实现这个功能? - 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
使用单一规则方法来检查是创建还是更新,并根据此返回数组。
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 - lewis4u
是的,如果您检查路由名称或路由参数,则两者都可以工作,当自定义命名路由时,路由名称可能会产生问题,但参数不会产生该问题。 :) - Sagar Rabadiya
所以最好我改为使用 if($this->route('event')) 来代替 if(\Route::currentRouteName() == 'events.update') - lewis4u

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接