【问题标题】:Why laravel validation not work correct when validate for empty string?为什么在验证空字符串时 laravel 验证不正确?
【发布时间】:2019-03-29 14:59:22
【问题描述】:

简介:

我已验证空字符串的请求值。

代码:

if(isset($request->name)) {
    $this->validate($request, [
        'name' => [
            function ($attribute, $value, $fail) {
                if (mb_strlen(preg_replace('/\s/', '', $value)) == 0) {
                    $fail($attribute.' is can't be empty.');
                }
            }
        ]
    ]);
    $user->name = $request->name;
    $user->save(); 
}

也厌倦了自定义规则。

规则代码:

public function passes($attribute, $value)
{
    $result = preg_replace('/\s/', '', $value);
    return mb_strlen($result) == 0 ? false : true;
}

/**
 * Get the validation error message.
 *
 * @return string
 */
public function message()
{
    return "Attribute value can't be empty string.";
}

规则测试代码:

if(isset($request->name)) {
    $this->validate($request, [
        'name' => [
            new IsEmptyString
        ]
    ]);
    $user->name= $request->name;
    $user->save(); 
}

问题:

哪里有错误?当我检查空字符串的请求值时,为什么 laravel 不发送验证错误消息?

谢谢!

【问题讨论】:

  • 当然验证不适用于空字符串。验证甚至不需要空字符串,因为您已将其放在 if 条件中。
  • @Tharaka Dilshan 很好理解,但是如果我只用条件单独检查每个字段呢?那怎么做验证呢?在我的情况下,数据库中也没有记录空字符串,但我无法通知用户他输入了一个空字段。
  • 条件中的其他类型的验证在我的情况下有效,只有当空字符串不起作用时。
  • 是的,那是因为您已将 validate 函数放在 if(isset($request->name)) 中。难道你不明白,如果name 为空,则验证函数甚至不会被调用。
  • 我了解你@Tharaka Dilshan。但是我怎么能告诉用户他输入了一个空字符串呢?

标签: laravel validation laravel-5.7


【解决方案1】:

在您的情况下,您必须将您的条件更改为:

if(array_key_exists('name', $request->all())) {

}

当您检查 isset($request->name) 并且此条件结果返回 false 并且验证代码甚至没有运行并且条件返回 false 的事实时。

通常,您的工作代码如下所示:

if(array_key_exists('name', $request->all())) {
    $this->validate($request, [
        'name' => [
            'required',
            function ($attribute, $value, $fail) {
                if (mb_strlen(preg_replace('/\s/', '', $value)) == 0) {
                    $fail($attribute." is can't be empty.");
                }
            }
        ]
    ]);

    $user->name = $request->name;
    $user->save();  
}

【讨论】:

  • 谢谢,@Felix Cruz,您的代码在条件下工作
【解决方案2】:

删除if() 条件。然后将required 规则添加到验证中。

$this->validate($request, [
    'name' => ['required',
        function ($attribute, $value, $fail) {
            if (mb_strlen(preg_replace('/\s/', '', $value)) == 0) {
                $fail($attribute.' is can't be empty.');
            }
        }
    ]
]);
$user->name = $request->name;
$user->save(); 

【讨论】:

    猜你喜欢
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 2019-11-03
    相关资源
    最近更新 更多