验证Laravel请求的最佳方法

时间:2019-03-15 16:08:28

标签: php laravel laravel-request laravel-5.8

在我的资源控制器中,我具有一个具有几乎相同的验证规则的存储和更新功能。因为验证有点复杂,所以我为此创建了一个Request

但是由于验证规则略有不同,因此我必须创建两个请求:

  • 一个要存储
  • 一个要更新。

但是,所以我在两个不同的地方拥有几乎相同的数组,如果决定更改它,则必须编辑两个不同的文件。有更好的方法吗?

我考虑过创建一个额外的Request类,该类具有一个包含通用规则的数组,并且存储和更新Request的类都从该类继承,并使用基类中的数组来组合验证规则。

但是添加一个额外的类并从中继承对我来说似乎有点太多,因为一个或规则不同。

我想到的另一种方法是只检查Request类中的通用规则,并在store和update函数中添加额外的验证,但是验证将在两个不同的地方完成,这会使项目更加混乱

我正在使用Laravel 5.8版

3 个答案:

答案 0 :(得分:3)

正如@apokryfos所说,没有上下文很难说,但是如果您不想使用继承,则可以在request类中验证request方法以从验证数组中添加/删除元素:

/** YourCustomFormRequest.php */

    //

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
       $rules = ['here', 'goes', 'your', 'common', 'rules'];

       if ($this->isMethod('post'))
       {
           array_merge($rules, ['a', 'specific', 'rule']);           
       }

       if ($this->isMethod('put')) // or 'patch'
       {
           array_merge($rules, ['another', 'specific', 'rule']);           
       }


        return $rules;
    }

    //

这样做的逻辑是,当您创建对象时,您应该发出一个POST请求,但是在更新时,您使用PUT / PATCH代替,因此我们得到的是用于从验证数组添加/删除条件的方法。

还没有测试,但这应该可行。


PS:为了获得更好的代码,您应该考虑将代码解耦并创建特定的类。

答案 1 :(得分:2)

我建议继承:

abstract class BaseRequest extends FormRequest {

        public function rules() {
              return [ /* common rules */ ]; 
        }
}

class StoreRequest extends BaseRequest {

       public function rules() {
           return array_merge(parent::rules(), [
               /* extra rules including overrides
           ]);
       }
}

您也可以对更新请求执行相同的操作。这将创建一个中心位置来管理请求中的共性。

这就是说,没有实际的代码,我们无法真正知道最适合您的情况。

答案 2 :(得分:1)

您可以检查请求中是否存在指示更新的内容。例如:

public function rules() {
    $rules = [];

    // these rules apply to both
    $rules['title'] = ['required'];

    if($this->input('id')) {
        // these rules only apply to updates
        $rules['something_specific_to_updates'] = ['foo'];
    } else {
        // these rules only apply to new records
        $rules['something_specific_to_new_records'] = ['bar'];
    }

    return $rules;
}

您还可以查看$this->route('id')来查看路由参数的值,而不是表单的$this->input POST数据中的值。