我有一个我似乎无法弄清楚的面条刮痕。我正在验证唯一的用户名和电子邮件地址。我有以下规则:
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
这不适用于用户名。我得到同样的问题。
我无法弄清楚为什么这适用于电子邮件,而不是用户名。
任何人都有类似问题或知道我哪里出错了?
非常感谢,
答案 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
不是正常的异常,因此要么创建此异常类型,要么修改代码以处理验证错误。