如果 Laravel 中的值不为空,如何验证输入字段

How to validate an input field if value is not null in Laravel

我正在尝试使用 laravel 5.4

创建和更新用户

这是为创建用户添加的验证。有效。

$this->validate($request, [
    'name' => 'required|max:255',
    'email' => 'required|email|max:255|unique:users',
    'password' => 'required|min:6|confirmed',
]);

更新时密码字段不是必需的。但如果密码字段不为空,则验证 min:6 和确认规则。尝试使用 sometimes.. 但没有用..

$this->validate($request, [
    'name' => 'required|max:255',
    'email' => 'required|email|max:255|unique:users,email,'.$id,
    'password' => 'sometimes|min:6|confirmed',
]);

尝试使用可空作为规则

'password' => 'nullable|min:6|confirmed',

https://laravel.com/docs/5.8/validation#a-note-on-optional-fields

我会这样做:

//For new or create :
$this->validate($request, [
    'name' => 'required|max:255',
    'email' => 'required|email|max:255|unique:users',
    'password' => 'required|min:6|confirmed',
]);

//For edit or update:
$this->validate($request, [
    'name' => 'required|max:255',
    'email' => 'required|email|max:255|unique:users',
    'password' => 'min:6|confirmed',//just remove required from password rule
]);

解释:
这样,只有在 request
中定义(存在)时才会验证该值 如果您使用 nullable,那么验证器将接受 null 作为值(我认为这是不可接受的)
如果您从更新中删除 password 验证,则此输入根本不会被验证,并且 any value 将被接受(这同样是不可接受的) ;

万一列可以为空

'password' => 'nullable|min:6|confirmed',

@Rejinderi 的回答是正确的!

如果列不可为空(这可能对其他有帮助)

'password' => 'sometimes|required|min:6|confirmed',

结果

username = 'admin',
password = null // fail- required

username = 'admin',
password = 123 // fail- min:6

username = 'admin' // pass- validate only exist

我们也可以根据 Documentation

使用验证器 Class 的 sometimes 方法来实现这一点
use Illuminate\Support\Facades\Validator;

//... your code ...

$validator = Validator::make($request->all(), [
      'name' => 'required',
      'contact' => 'required',
]);
$validator->sometimes('password', 'min:6|confirmed', function ($input) {
    return (strlen($input->password) > 0);
});
if ($validator->fails()) {
     return redirect()->back()->withErrors($validator)->withInput();
} 

这将在密码字段的长度大于 0 时验证密码属性规则。否则将忽略该密码属性的规则。