Laravel 验证器 `required` 也对空字符串失败
Laravel validator `required` fails for empty string also
我正在我的代码中尝试 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 版本 5.5.18)中,但在 linux 环境(PHP 版本 5.5.9- 1ubuntu4.5).
如果传递空字符串,required
规则实际上 returns 为 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 检查值是否不为 null:
Validator::extendImplicit('attribute_exists', function($attribute, $value, $parameters){
return ! is_null($value);
});
(需要 extendImplicit
,因为使用 extend
自定义规则只会 运行 当值不是空字符串时)
然后像这样使用它:
\Validator::make(array("name"=>""), array("name"=>"attribute_exists"));
在 Laravel 5.6 中你可以使用这个:
public function rules()
{
return [
'my_field' => 'required|string|nullable'
];
}
可能也适用于旧版本,我只试过 5.6
我用这个:
'my_field' => 'present'
i have developed my own way to process optional input. i use associative array for validation.
$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");
我正在我的代码中尝试 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 版本 5.5.18)中,但在 linux 环境(PHP 版本 5.5.9- 1ubuntu4.5).
如果传递空字符串,required
规则实际上 returns 为 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 检查值是否不为 null:
Validator::extendImplicit('attribute_exists', function($attribute, $value, $parameters){
return ! is_null($value);
});
(需要 extendImplicit
,因为使用 extend
自定义规则只会 运行 当值不是空字符串时)
然后像这样使用它:
\Validator::make(array("name"=>""), array("name"=>"attribute_exists"));
在 Laravel 5.6 中你可以使用这个:
public function rules()
{
return [
'my_field' => 'required|string|nullable'
];
}
可能也适用于旧版本,我只试过 5.6
我用这个:
'my_field' => 'present'
i have developed my own way to process optional input. i use associative array for validation.
$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");