验证Laravel请求的最佳方法

问题描述 投票:1回答:3

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

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

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

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

我想过创建一个额外的Request类,它有一个带有通用规则的数组,并且存储和更新Request的类继承自这个类,并使用基类中的数组来组合验证规则。

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

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

我正在使用Laravel 5.8版

php laravel laravel-request laravel-5.8
3个回答
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
           ]);
       }
}

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

这说没有实际的代码,我们真的不知道什么是最适合你的情况。


3
投票

正如@apokryfos所说,没有上下文很难说,但如果你不想使用继承,你可以验证请求类中的请求方法来添加/删除验证数组中的元素:

/** 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代替,所以我们只是使用used方法来添加/删除验证数组中的条件。

尚未测试,但这应该工作。


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


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数据中的值。

© www.soinside.com 2019 - 2024. All rights reserved.