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

How to validate laravel input only when data is present?

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

$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 returns 空输入字段错误,例如 returns 像这样的错误 “站点名称必须是字符串。”第一个验证规则

请问我做错了什么?

编辑

所以我听取了@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',
        ]);

在这种情况下,您需要使用 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);