【问题标题】:Dynamic FormRequest Validation (Laravel)动态表单请求验证 (Laravel)
【发布时间】:2018-02-11 11:04:13
【问题描述】:

是否可以在我的函数中创建动态 FormRequest 验证?请参阅下面的示例代码。

public function store(Request $request)
{
    Model::create($request->all());
    return redirect(url('/'));
}

我的意思是我将“Request”参数更改为变量$formRequest。

我的目标是为单个模型的动态数据集创建不同的验证规则。

如果我可以通过其他方式实现此目的,请告诉我。谢谢!

编辑:

示例场景: 我有一个包含名字、中间名和姓氏字段的表单。

第一条规则:

public function rules()
{
    return [
    'firstname' => 'required',
    'middlename' => 'required',
    'lastname' => 'required'
    ];
}

第二条规则:

public function rules()
{
    return [
    'firstname' => 'required',
    'lastname' => 'required'
    ];
}

第二条规则中的 Where 只需要名字和姓氏。

我只是想知道是否有其他方法可以做到这一点,而不是创建多个 store 方法并添加更多路由。

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    在验证规则中,您可以简单地添加“有时”规则。你可以在这里找到它https://laravel.com/docs/5.7/validation#conditionally-adding-rules

       public function rules()
    {
        return [
        'firstname' => 'required',
        'middlename' => 'sometimes|required',
        'lastname' => 'required'
        ];
    }
    

    【讨论】:

      【解决方案2】:

      跳过FormRequest 并在$request 实例上使用validate 方法可以实现此目的。 Laracasts 甚至还上了一课。

      public function store(Request $request) {
          $rules = [/*...*/];
      
          $attributes = $request->validate($rules);
      
          Model::create($attributes);
      
          return redirect(url('/'));
      }
      

      【讨论】:

      • 这是我的想法,但如果可能的话,我想只使用一个函数。
      • 我改写了使用$request->validate 的答案。这可能适合你。
      • 将您的建议与@Sletheren 结合起来给了我一个想法。谢谢你们俩。
      【解决方案3】:

      您可以创建自定义请求:

      php artisan make:request CustomRequest
      

      这将生成这个类:

      class CustomRequest extends FormRequest
      {
          /**
           * Determine if the user is authorized to make this request.
           *
           * @return bool
           */
          public function authorize()
          {
              return false;
          }
      
          /**
           * Get the validation rules that apply to the request.
           *
           * @return array
           */
          public function rules()
          {
              return [
                  //
              ];
          }
      }
      

      authorize() 方法将首先确定是否可以验证请求。

      rules() 方法将返回当前请求的验证规则。

      然后在你的控制器函数中:

      public function yourfunction(CustomRequest $request)
      

      【讨论】:

      • 嗨@Sletheren,是的,我知道这一点。我想要做的是验证一组动态数据。例如,数据 1 的必填字段集是名字、中间名、姓氏,那么数据 2 的必填字段只有名字、姓氏。所以我想到的是我会创建 data1Request 和 data2Request。
      • 是的,您也可以这样做,您放置一个通用的 Request 对象,然后使用 if 语句进行测试(例如:if($request['type'] == 'data1') 然后执行自定义验证
      • 嗯,对你所说的有所了解。谢谢@Sletheren
      • 很高兴我能帮上忙 :)
      猜你喜欢
      • 2016-09-02
      • 2016-05-23
      • 2016-03-11
      • 2015-06-09
      • 1970-01-01
      • 2020-12-11
      • 2016-05-20
      • 2019-04-12
      相关资源
      最近更新 更多