验证数组中的 Laravel 嵌套规则

Posted

技术标签:

【中文标题】验证数组中的 Laravel 嵌套规则【英文标题】:Validate Laravel Nested Rules in Array 【发布时间】:2019-07-25 13:37:27 【问题描述】:

我使用 Laravel,我想编写优雅的验证规则 :) 使用这个框架真的很容易,但在面对 1:n 关系时我不知道如何处理。

我有两个资源,用户联系人。一个用户可以有多个联系人。

所以,我想要一个表单,您可以在其中填写所有用户字段所有联系人信息。 为此,我想写一个这样的请求:

用户请求:

public function rules()
    return [
        'name' => 'required|string',
        'email' => 'required|email|unique:exists:users,id',
        'contacts' => 'array',
        'contacts.*' => new ContactRequest() // This is the problem
    ]

我的问题是:如何应用这种类型的验证?特别是在使用数组时,如何进行模块化验证以应用嵌套资源的验证?还是我应该开发一个 ContactRule?

编辑:

我想要这样的前端发送表单:

` // POST: users
    
        'name': 'UserName',
        'email': 'user@mail.com'
        'contacts': [
            [
                'email' => 'contac_1@mail.com',
                'contact_type_id => 1
            ],
                        [
                'email' => 'contac_2@mail.com',
                'contact_type_id => 2
            ],

    
`

就是这样, 谢谢!

【问题讨论】:

请您展示您的表单示例以及用户如何添加其他联系方式,即使用 javascript 或单独的表单? contacts.*.email 可以工作 嗨!抱歉,我添加了我希望收到的已提交表单数据:P 我想对“联系人”输入数组应用验证。我可以保持验证模块化吗?让 UserRequest.php 尽可能简单,特别是在其他请求中重用相同的联系人验证 我不喜欢contacts.*.email,因为这个验证会(而且已经很复杂了)contacts.*.emailcontacts.*.contact_type_idcontact.*... 等。而且,这个联系人验证会在多个资源中使用,所以,我将有重复的代码。这就是我想通过这种模块化尝试避免的......我喜欢使用单行,就像我的例子:D 如何验证联系人数组是否包含不同的字段,例如。 email1,contact_type_id1,email2,contact_type_id2 【参考方案1】:

我们有一个 API,在每个请求或发布/补丁中都有 100 条结果。 我们仍然使用:

'data.relationships.users.data.*.id' => [
    'string',
    'unique:api_groups,name,' . ($this->route('group')->id ?? 0),
]

所以对你来说

'contacts.*.email' => 'required|email|unique:exists:users,id'

完美运行。它不会变得更复杂或任何东西。

【讨论】:

当它是一个或两个简单字段时很好,但想象一下它何时增长。例如,5 个字段,contacts.*.emailcontacts.*.field_2contacts.*.field_3contacts.*.field_4contacts.*.field_5 等等。此外,这将用于多个端点(不仅在用户端点、Model2、模型 3 等)。会有很多重复的代码:( 不存在重复代码,因为您使用表单请求。 laravel.com/docs/5.7/validation#form-request-validation public function storeUser(StoreBlogPost $request) //做事 public function storeModel2(StoreBlogPost $request) //做事

以上是关于验证数组中的 Laravel 嵌套规则的主要内容,如果未能解决你的问题,请参考以下文章

嵌套数组验证 laravel

Laravel 验证规则 - 要求字段显式为空,具体取决于另一个字段的值 (type_id)

如何验证嵌套数组并在 laravel 中显示消息

Laravel 填充数组元素的验证规则

在 Laravel 中验证数组时,如何使用数组项规则添加验证自定义消息?

Laravel中的信息验证 和 语言包