Laravel验证器`required`也因空字符串而失败

时间:2015-01-19 08:37:04

标签: php macos validation laravel

我正在我的代码中尝试使用laravel required验证器,不幸的是它甚至因为空字符串而失败。我不希望它因空字符串而失败。

$validator = \Validator::make(array("name"=>""), array("name"=>"required"));
if ($validator->fails()){
    var_dump($validator->messages());
} else {
    die("no errors :)");
}

它给了我以下输出

object(Illuminate\Support\MessageBag)[602]
  protected 'messages' => 
    array (size=1)
      'name' => 
        array (size=1)
          0 => string 'The name field is required.' (length=27)
  protected 'format' => string ':message' (length=8)

它应该通过,因为我给了一个空字符串作为name字段。

上述行为发生在OSX环境(PHP Version 5.5.18)中,但在linux环境中运行良好(PHP Version 5.5.9-1ubuntu4.5)。

4 个答案:

答案 0 :(得分:11)

如果传递空字符串,则required规则实际返回false。

如果我们查看代码(Illuminate\Validation\Validator

protected function validateRequired($attribute, $value)
{
    if (is_null($value))
    {
        return false;
    }
    elseif (is_string($value) && trim($value) === '')
    {
        return false;
    }

    // [...]

    return true;
}

我认为你唯一的选择是编写own validation rule来检查值是否为空:

Validator::extendImplicit('attribute_exists', function($attribute, $value, $parameters){
    return ! is_null($value);
});

(需要extendImplicit因为extend自定义规则只会在值不是空字符串时运行。

然后像这样使用它:

\Validator::make(array("name"=>""), array("name"=>"attribute_exists"));

答案 1 :(得分:2)

我用这个:

'my_field' => 'present'  

答案 2 :(得分:1)

在laravel 5.6中,您可以使用以下代码:

public function rules()
{
    return [
        'my_field' => 'required|string|nullable'
    ];
}

在旧版本上也可以使用,我只在5.6上尝试过

答案 3 :(得分:0)

我已经开发出了自己的方式来处理可选输入。我使用关联数组进行验证。

$rules = array('sltcategoryid' => 'required',   
            'txttitle' => 'required|min:10|max:255',    
            'txtdetail' => 'required|min:10|max:255',   
            'rdocontenttype' => 'required', 
            'rdoislive' => 'required');
         if($request->rdocontenttype=="1" || $request->rdocontenttype=="2" && trim($request->txtcontent)=="")
            $rules["txtcontent"]="required|min:10|max:2048";
         else if ($request->rdocontenttype=="3" && isset($request->fildata)==false)
             $rules["fildata"] ="required|mimes:png,jpg,jpeg,pdf,doc,xls,ppt,bmp,zip";
         $validator = Validator::make($request->all(),$rules);
         if ($validator->fails()) 
                return redirect('content/create')->withErrors($validator)->withInput();
             else 
                return back()->with("message","content processed successfully");