Laravel 请求验证 - 可为空的图像

Mik*_*iko 3 validation laravel

我有包含用户名、电子邮件、密码和头像(图像)字段的注册表单。除了图像字段之外,一切正常,该字段可以为空。我使用 Vue 作为前端,并使用 axios 将数据发送到 Laravel。

这是验证:

public function register(Request $request)
{
    $request->validate([
        'username' => 'required|string|max:255|unique:users',
        'email' => 'required|string|email|max:255|unique:users',
        'password' => 'required|string|min:6',
        'avatar' => 'nullable|image|mimes:jpg,jpeg,png|max:1999'
    ]);

    $fileNameToStore = 'noimage.jpg';

    return User::create([
        'username' => $request->username,
        'email' => $request->email,
        'password' => Hash::make($request->password),
        'avatar' => $fileNameToStore
    ]);
}
Run Code Online (Sandbox Code Playgroud)

这就是我发送数据的方式:

register(context, data) {
      let formData = new FormData();
      formData.append('avatar', data.avatar)
      formData.append('username', data.username)
      formData.append('email', data.email)
      formData.append('password', data.password)

      return new Promise((resolve, reject) => {
        axios.post('/register', formData,{
          headers: {
              'Content-Type': 'multipart/form-data'
          }
        })
          .then(response => {
            resolve(response)
          })
          .catch(error => {
            reject(error)
          })
      })
}
Run Code Online (Sandbox Code Playgroud)

如果我填写每个文件,它就可以正常工作,并且其他诸如检查扩展名或文件大小之类的事情也可以工作,唯一的问题是当我不选择任何图像时。我在验证中包含了 nullable,但我仍然从验证中收到错误消息,它必须是图像以及它需要具有哪个扩展名。

Chi*_*ung 5

如果您data.avatar未定义或为空,您的服务器将收到一个undefinednull字符串作为您的头像字段的值。因此,Laravel 将在字符串上测试图像规则。

要修复此问题,您可以确保您的图像未定义为在请求中发送。

if (data.avatar) {
    formData.append('avatar', data.avatar);
}
Run Code Online (Sandbox Code Playgroud)

或者

formData.append('avatar', data.avatar ?? '');
Run Code Online (Sandbox Code Playgroud)