如何仅在数据存在时验证 laravel 输入?

Posted

技术标签:

【中文标题】如何仅在数据存在时验证 laravel 输入?【英文标题】:How to validate laravel input only when data is present? 【发布时间】:2022-01-04 00:11:20 【问题描述】:

所以我有一个 Laravel 表单来收集数据,我使用相同的表单来创建和更新表格。问题是我只想在输入字段包含数据时对其进行验证,这是我的验证逻辑。

$validated = $request->validate([
            'site_name' => 'sometimes|string',
            'site_email' => 'sometimes|email',
            'site_keywords' => 'sometimes|string',
            'site_description' => 'sometimes|string',
            'site_acronym' => 'sometimes|string|max:7',
            'site_favicon' => 'sometimes|mimes:jpg,png,jpeg,svg',
            'site_logo' => 'sometimes||mimes:jpg,png,jpeg,svg',
            'site_currency' => 'sometimes|string',
            'site_currency_symbol' => 'sometimes|string',
        ]);

但是当表单被提交时,laravel 会返回一个空输入字段的错误,例如它会返回一个错误,例如 "The site name must be a string."对于第一个验证规则。

请问我做错了什么?

编辑

所以我接受了@roj-vroemen 的建议,并使用可空验证规则修改了我的代码,现在它工作得很好。 这是新的代码块

$validated = $request->validate([
            'site_name' => 'string|nullable|sometimes',
            'site_email' => 'email|nullable|sometimes',
            'site_keywords' => 'string|nullable|sometimes',
            'site_description' => 'string|nullable|sometimes',
            'site_acronym' => 'string|nullable|sometimes|max:7',
            'site_favicon' => 'mimes:jpg,png,jpeg,svg|nullable|sometimes',
            'site_logo' => 'mimes:jpg,png,jpeg,svg|nullable|sometimes',
            'site_currency' => 'string|nullable|sometimes',
            'site_currency_symbol' => 'string|nullable|sometimes',
        ]);

【问题讨论】:

您是否使用javascript提交表单? 不,没有javascript,它是普通刀片。 你试过可以为空吗? 如果字段为 null,您是否只想通过验证,或者您还想从 validated 数组中删除它? 【参考方案1】:

在这种情况下,您需要使用 nullablesometimes 基本上意味着它仅在该字段存在于数据中时运行该字段的验证。

简而言之: 如果要允许 null 值,请使用 nullable。https://laravel.com/docs/8.x/validation#rule-nullable

如果您只想验证给定输入数组中存在的字段,请使用sometimes。https://laravel.com/docs/8.x/validation#validating-when-present

注意:您可能需要确保过滤掉空值,因为包含 null 的字段仍然存在:$validated = array_filter($validated);

【讨论】:

我结合了 nullable 和有时,现在它可以按我的意愿工作。感谢您的帮助 我还观察到,在编写验证规则时,顺序很重要,有时我把它放在最后比我把它放在第一位时效果更好。我的观察正确吗? 实际上我不确定,在文档中没有看到关于它的注释,并且在扫描源代码时没有看到任何暗示它的内容,但我当然可能错过了它: )

以上是关于如何仅在数据存在时验证 laravel 输入?的主要内容,如果未能解决你的问题,请参考以下文章

仅在验证成功时渲染组件

使用 laravel 框架提交数据后清除表单输入

Laravel 验证仅在字段不为空时验证正则表达式

Laravel 仅在模型记录属于经过身份验证的用户时才检索它们

Laravel 验证:存在附加列条件 - 自定义验证规则

Laravel 有时验证规则