【问题标题】:Having trouble dealing with validation of information from edit form无法处理来自编辑表单的信息验证
【发布时间】:2018-05-13 21:24:56
【问题描述】:

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

例如,用户可能只想编辑 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();
}

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    如果您查看有关 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 列作为主键,请将其添加为最后一个参数。

    【讨论】:

    • 我可以对密码做类似的事情吗?目前,密码输入字段默认为空,因为它们是输入密码。如果我不想更改密码并将其留空,则会收到“密码必须至少为 5 个字符”。但我不想在用户真正想要更改密码时删除该验证。此外,如果我删除它,用户可以将他的密码更改为空。所以我只想更改密码,如果我在输入字段中写了新内容。
    • 从技术上讲,这是一个新问题,但您可以创建没有密码的规则数组并使用if ($request-&gt;input('password', false) !== false) 检查输入,从而过滤掉空输入。如果不为空,则在数组中添加一个额外的规则。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 2013-07-23
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    相关资源
    最近更新 更多