【问题标题】:Laravel string validation to allow empty stringsLaravel 字符串验证以允许空字符串
【发布时间】:2019-07-16 17:49:26
【问题描述】:

在 Laravel 5.7 中,我正在使用表单请求验证:

public function rules() 
{
    return [
        'age' => 'integer',
        'title' => 'string|max:50'
    ];
}

如果我使用此有效负载向我的 API 提交请求:

{
  "age": 24,
  "title": ""
}

Laravel 返回错误:

{
    "message": "The given data was invalid.",
    "errors": {
        "title": [
            "The title must be a string."
        ]
    }
}

我希望它能够通过验证,因为标题是一个字符串,尽管它是一个空的。应该如何制定验证以允许空字符串?

【问题讨论】:

  • 尝试添加 presentrequired 验证器
  • @ka_lin Present and required 不描述这个属性,它不需要存在也不是必需的。

标签: php laravel validation


【解决方案1】:

你需要nullable 来允许一个空字符串

public function rules() 
{
    return [
        'age' => 'integer',
        'title' => 'nullable|string|max:50'
    ];
}

【讨论】:

  • nullable - 验证中的字段可能为空。这在验证可以包含空值的字符串和整数等原语时特别有用。
  • 这不允许空字符串,这只是忽略空字符串,将其视为null。如果我们想用空字符串覆盖现有的title 字段怎么办?
  • @GluePear 如果你想这样做,你还需要从你的中间件中禁用\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class。该中间件会自动将空字符串转换为 null。从数据库规范化的角度来看,将null 作为值而不是空字符串会更好。
  • 我确认这确实有效。如果您将该特定字段留空,nullable 会使其为空。 Here are the docs.
【解决方案2】:

尝试查看 ConvertEmptyStringsToNull 中间件是否处于活动状态,然后它将解释此行为,请参阅 docs

【讨论】:

  • 谢谢,这很有用。如果它在其他地方使用,我没有信心删除该中间件。但它解释了这种行为。
【解决方案3】:

present 规则检查是否存在一个键,但让它为空。

#现在

现在 验证字段必须存在于输入数据中,但可以为空。

https://laravel.com/docs/5.7/validation#rule-present

【讨论】:

    【解决方案4】:

    我会努力的

    public function rules() 
    {
        return [
            'age' => 'integer',
            'title' => 'string|sometimes'
        ];
    }
    

    这只会在标题存在时验证它。

    【讨论】:

    • 当您希望它始终存在时不回答问题,尽管允许为空。
    【解决方案5】:

    避免接触中间件设置。

    在验证运行之前使用 Laravel 内置函数来操作数据。

    内部验证类

    protected function prepareForValidation()
        {
            if($this->title == null )
                $this->merge(['title'=>'']);
        }
    

    【讨论】:

      【解决方案6】:

      也许添加min 约束可以解决问题?

      public function rules() 
      {
          return [
              'age' => 'integer',
              'title' => 'string|min:0|max:50'
          ];
      }
      

      【讨论】:

      • 这是错误的,指定更严格的规则不起作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 2014-06-21
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      相关资源
      最近更新 更多