无法处理编辑表单中的信息验证

时间:2018-05-13 21:24:57

标签: php laravel

当用户进入设置视图时,视图会在输入字段中显示其当前信息,这些信息可以编辑然后保存。但是,我面临一个小障碍,我不确定如何避免。例如:

用户可能只想编辑1个字段,例如用户名,但是,要做到这一点,他必须更改他的电子邮件,否则他会收到一条消息,表明该电子邮件已被删除确实如此,该电子邮件已由同一用户使用。即使不需要密码字段,他也会收到密码必须至少为5个字符的消息,如果我删除该验证,则用户将能够添加空密码。

我只是想这样做,所以我只能编辑1个字段,而不必改变其余部分。

以下是我的观点,允许用户更改其当前帐户信息:

<form method="post" action="{{ route('updateProfile', $user) }}" enctype="multipart/form-data">

    <input type="text" name="first_name"  value="{{ $user->first_name }}" />

    <input type="text" name="last_name"  value="{{ $user->last_name }}" />

    <input type="text" name="username"  value="{{ $user->username }}" />

    <input type="email" name="email"  value="{{ $user->email }}" />

    <input type="password" name="password" />

    <input type="password" name="password_confirmation" />

    <input type="file" name="file" />

    {{ csrf_field() }}

    {{ method_field('patch') }}

    <button class='Submit' type="submit" name="submit">Save Changes</button>

</form>

这是我的profileUpdate功能:

public function updateProfile(Request $request, User $user){

    $this->validate($request, [
        'first_name' => 'max:120',
        'last_name' => 'max:120',
        'username' => 'max:120',
        'email' => 'email|unique:users',
        'password' => 'min:5|max:12|confirmed',
        'file' => 'max:1999'
    ]);

    $file = $request->file('file')->getClientOriginalName();
    $fileName = pathinfo($file, PATHINFO_FILENAME);
    $extension = $request->file('file')->getClientOriginalExtension();
    $fileNameToStore = $fileName.'_'.time().'.'.$extension;
    $fileNameToStore = str_replace(' ', '', $fileNameToStore);
    $path = $request->file('file')->storeAs('public/uploads/profile_pictures/', $fileNameToStore);

    $user->first_name = request('first_name');
    $user->last_name = request('last_name');
    $user->username = request('username');
    $user->email = request('email');
    $user->password = bcrypt(request('password'));
    $user->profile_picture = $fileNameToStore;

    $user->save();

    return back();
}

1 个答案:

答案 0 :(得分:2)

如果您查看有关unique规则的验证rule documentation,您会看到可以指定其他参数:

unique:table,column,except,idColumn

使用第三个参数,您可以告诉验证者忽略表中的某个记录。

将验证规则更改为以下内容:

$this->validate($request, [
    'first_name' => 'max:120',
    'last_name' => 'max:120',
    'username' => 'max:120',
    'email' => 'email|unique:users,email,'.$user->id,
    'password' => 'min:5|max:12|confirmed',
    'file' => 'max:1999'
]);

这可以解决您的问题。

如果由于某种原因您没有id列作为主键,请将其添加为最后一个参数。