Laravel:验证唯一用户名问题

时间:2014-08-22 15:20:52

标签: php mysql validation laravel laravel-4

我有一个我似乎无法弄清楚的面条刮痕。我正在验证唯一的用户名和电子邮件地址。我有以下规则:

protected $rules = array(
    'username' => 'required|min:4|unique:users,username',
    'email'    => 'email|unique:users,email',
    'password' => 'min:6',
);

如果我更新具有用户名(与当前版本相同)的表单,则会出现The username has already been taken.错误。如果我对电子邮件做同样的事情,我根本就没有错误。

我知道将最后一个参数添加到唯一验证中:

'unique:users,username,{{$id}}''unique:users,username,'.$id

这不适用于用户名。我得到同样的问题。

我无法弄清楚为什么这适用于电子邮件,而不是用户名。

任何人都有类似问题或知道我哪里出错了?

非常感谢,

1 个答案:

答案 0 :(得分:0)

最可能的原因是因为$id可能是通过您的URI引入的,因此它不属于Input::all()

要验证它,你需要包含一个隐藏的" id"在您的表单或请求中的字段 OR 您需要使用validate方法扩展存储库或控制器,该方法将id添加回正在验证的数据数组中。

/**
 * Validate
 *
 * @param $data
 * @param $id
 * @throws \ValidationException
 * @return boolean
 */
public function validate($data, $id = null)
{
    $rules = SomeModel::$rules;
    if(! is_null($id))
    {
       $data['id'] = $id;
       // Only add exclude rule to end of rule if you haven't included already
       $rules['username'] .= ',' . $data['id'];
    }
    $validator = \Validator::make($data, $rules);
    if($validator->fails()) {
        throw new \ValidationException($validator);
    }
    return TRUE;
}

注意: ValidationException不是正常的异常,因此要么创建此异常类型,要么修改代码以处理验证错误。