【问题标题】:Laravel - can I inject a FormRequest inside a FormRequest?Laravel - 我可以在 FormRequest 中注入 FormRequest 吗?
【发布时间】:2017-09-03 02:28:49
【问题描述】:

我有一组复杂的规则,可以动态构建,但理想情况下,我需要先验证一组规则,然后再继续下一个,即

我有一个 json 对象 {data: {}},我想在继续验证嵌套在 data 中的字段之前检查它是否存在,这些字段还有其他嵌套字段等。

我想有一个FormRequest 类,比如ApiRequest,它可以验证data,然后是另一个,比如UploadRequest,它在data 已经被验证的基础上添加了更多规则。

我可以做到这一点,并且它可以通过在 UploadRequest 的构造函数中注入 ApiRequest 来实现,这允许在继续下一组之前在 ApiRequest 中验证完整的规则集:

/**
 * UploadRequest constructor.
 * @param ApiRequest $apiRequest
 */
public function __construct(ApiRequest $apiRequest) {

    // If we got here, ApiRequest passed validation, woo!

}

这看起来像是一种反模式还是处理此问题的“错误”方式? 我试图考虑一个由迷你请求组成的请求,即通过 api 的上传请求实际上是一个 api 请求,然后是一个上传请求等。但我不确定我是否只是想证明这一点我自己。

任何帮助将不胜感激。

谢谢!

【问题讨论】:

    标签: forms laravel validation request


    【解决方案1】:

    您可以拥有一个 ApiRequest 类来验证所有端点的所有强制参数。

    class ApiRequests extends FormRequest
    {
    
        public function rules()
        {
            return [
                'data' => 'required',
                'data.field_1' => 'required|string',
                'data.field_2' => 'required|string'
            ];
        }
    
    }
    

    假设您的 API 有一个可以编辑用户个人资料的端点。向该端点发出的请求必须包括first_namelast_name。所以可以创建一个扩展ApiRequest 的新类:

    class EditUserRequest extends ClientRequest
    {
        public function rules()
        {
            return array_merge(parent::rules(), [
                'params.first_name' => 'required',
                'params.last_name' => 'required',
            ]);
        }
    }
    

    这会将ApiRequest 中的所有规则与EditUserRequest 所需的规则合并。

    然后在你的控制器中(例如UsersController):

    public function update(EditUserRequest $request) {
        .... your code goes here...
    }
    

    【讨论】:

    • 感谢您的回复!我也一直在这样做,但问题是当我有一个非常动态的规则列表需要构建时,这需要访问 data 属性及其嵌套属性(例如,我需要能够一次拉出结构的某些部分以进行验证)。我不想每次尝试在规则中访问它时都检查 data 等是否存在,我宁愿在知道数据存在的情况下点击这些规则,因为它通过了先前的验证。也许有更好的方法来验证 json 数据结构...
    • 然后验证控制器中的数据
    猜你喜欢
    • 1970-01-01
    • 2016-08-26
    • 2020-06-25
    • 2020-07-23
    • 2018-01-14
    • 2019-03-25
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    相关资源
    最近更新 更多