【问题标题】:Laravel validation methodsLaravel 验证方法
【发布时间】:2017-10-07 13:39:03
【问题描述】:

我尝试允许用户在他们的面板中更改(更新)他们的信息,我也想让他们更改他们的电子邮件地址和密码,但这是可选的,例如他们可能只是想更改他们的名字而不是更改电子邮件地址或密码,验证方法是什么?

我目前的验证是这样,但会返回电子邮件地址相同的错误:

public function update(Request $request, $id)
    {
        $user = User::find($id);
        $this->validate($request, array(
                'name' => 'required|string|max:255',
                'email' => 'nullable|string|email|max:255|unique:users',
                'gender' => 'required|string',
                'password' => 'nullable|string|min:6|confirmed',
            ));

        $user = User::find($id);

        $user->name = $request->input('name');
        $user->email = $request->input('email');
        $user->gender = $request->input('gender');
        $user->password = $request->input('password');

        $user->save();

        Session::flash('success', 'Your information was successfully updated.');

        return redirect()->route('users.list', $user->id);
    }

【问题讨论】:

  • 删除唯一的:用户
  • @BilalAhmed 这不是一个稳定的东西。删除这样的重要规则不是一个好选择。
  • 没有人这样做。您必须创建另一个页面以更新电子邮件地址
  • @BilalAhmed 删除 unique:users 我的问题将得到解决,但如果他们使用其他用户的电子邮件怎么办? kristoff我在他们的个人资料中编辑用户信息我应该制作其他页面吗?为什么?
  • 'email' => 'required|string|email|max:255|unique:users,'.$id,// 验证除现有 id 之外的唯一电子邮件请立即查看答案

标签: php laravel validation


【解决方案1】:

来自documentation,验证时可以忽略当前用户的邮箱:

'email' => Rule::unique('users')->ignore($user->id)

如果你的表使用了除id以外的主键列名,你可以在调用ignore方法时指定列名:

'email' => Rule::unique('users')->ignore($user->id, 'user_id')

所以,

   $this->validate($request, array(
        'name' => 'required|string|max:255',
        'email' => [
            'required','nullable','string','email','max:255',
            Rule::unique('users')->ignore($user->id),
        ],
        'gender' => 'required|string',
        'password' => 'nullable|string|min:6|confirmed',

    ));

【讨论】:

  • 你能分享完整的代码吗?有点混乱。如果我忽略它,他们何时想要编辑它呢?那么还是会被忽略吗?
  • 一切照旧。只需更改'email' 规则并忽略此特定电子邮件地址仅用于验证,不会影响其他任何内容。
  • 返回错误Class 'App\Http\Controllers\Rule' not found
  • 这不是一个错误的逻辑,事实上它是唯一正确的逻辑。你必须添加命名空间use Illuminate\Validation\Rule;
【解决方案2】:

你的用户更新应该是这样的:

public function update(Request $request, $id)
    {
        $user = User::find($id);
        $this->validate($request, array(
                'name' => 'required|string|max:255',
                'gender' => 'required|string',
                'password' => 'nullable|string|min:6|confirmed',
            ));

        $user = User::find($id);

        $user->name = $request->input('name');
        $user->gender = $request->input('gender');
        $user->password = $request->input('password');

        $user->save();

        Session::flash('success', 'Your information was successfully updated.');

        return redirect()->route('users.list', $user->id);
    }

那么您必须创建新页面以更新新地址。

【讨论】:

  • 为什么要删除电子邮件字段验证器?!像这样他们甚至可以使用非电子邮件只是文本或使其为空!
  • 当您允许用户注册时,您应该已经检查了电子邮件地址是否唯一?正确的 ?如果用户只是更新然后更改了新地址电子邮件,为什么您需要从注册中检查有效?
  • 确保新的电子邮件地址也是电子邮件地址,而不是简单的文本或空字段。强制他们只用电子邮件更改电子邮件。
【解决方案3】:
 $this->validate($request, array(
                'name' => 'required|string|max:255',
                'email' => 'nullable|string|email|max:255|unique:users,email,id,'.$userId,
                'gender' => 'required|string',
                'password' => 'nullable|string|min:6|confirmed',
            ));

$userId 是给定用户的用户表的 id

唯一需要 4 个参数 unique:table,column,except,idColumn

表 -> 表名

列 -> 唯一列名

except -> 排除列名

idColumn -> 排除列的值

【讨论】:

  • 未定义变量:userId
  • 将 $userId 更改为 $id
【解决方案4】:

只需将其更改为以下仅用于名称字段验证:

 $this->validate($request, array(
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users,'.$id,//validate for unique email except this id
            'gender' => 'required|string',
            'password' => 'required|string|min:6|confirmed',
        ));

【讨论】:

  • 没有人!当我让他们编辑时,我还需要验证其他字段我想让他们用有效数据更改他们的信息。
猜你喜欢
  • 2015-04-30
  • 2018-05-12
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 2019-08-06
  • 2019-04-12
  • 2014-11-06
  • 2018-02-18
相关资源
最近更新 更多