需要帮助更新验证规则中的唯一规则。我有一个抽象验证器,它将在存储到我的数据库之前验证规则,在规则数组中,我在创建或注册用户时将电子邮件设置为唯一的,但在更新用户时,如果电子邮件为用户所有,则enique电子邮件不应验证。
抽象类验证器
abstract class Validator {
protected $errors;
protected $attributes;
public function __construct($attributes = null)
{
$this->attributes = $attributes ?: 'Input::all();
}
public function passes()
{
$validation = 'Validator::make($this->attributes, $this->rules());
if ($validation->passes()) return true;
$this->errors = $validation->messages();
return false;
}
public function getErrors()
{
return $this->errors;
}
}
验证规则(UserRule.php)
use MyCustomValidatorNamespaceHere....
class UserRules extends Validator
public function rules()
{
return [
'email' => 'required|email|unique:users,email,id',
...
];
}
在我的UserController中,我在constractor中注入了UserRule。(UserRule$UserRule)。这是update方法中的代码。
public function update($id)
{
$if ($this->userRule->passes())
{
$this->user->find($id)->update(Input::all());
return .........
}
}
但验证总是失败,并显示电子邮件已被接收的错误。请帮帮伙计们。
问题在于您的规则。当您更新时,您需要使用不检查您更新的记录的unique
。所以你应该有:
unique:users,email,id
但例如:
unique:users,email,10
如果您编辑id为10的记录。
你可以做的是定义这个规则:
'email' => 'required|email|unique:users,email,{id}',
以及您的passes
方法:
public function passes($id = null)
{
$rules = $this->rules();
$rules['email'] = str_replace('{id}', $id, $rules['email']);
$validation = 'Validator::make($this->attributes, $rules);
if ($validation->passes()) return true;
$this->errors = $validation->messages();
return false;
}
现在使用更新规则:
if ($this->userRule->passes($id))
顺便说一句,你在$if ($this->userRule->passes())
中有错误——它应该是if
,而不是$if
您可以在请求类中使用route
方法从验证中排除id
public function rules()
{
return [
'email' => 'required|email|unique:users,email,'.$this->route('user'),
...
];
}
我以前遇到过这样的问题,很难找到答案。以下是我所做的。
class UserRules extends Validator {
public function __construct($input = NULL) {
$this->input = $input ?: 'Input::all();
if(isset($this->input['id'])):
self::$rules['username'] = 'required|unique:users,username,'.$this->input['id'];
self::$rules['email'] = 'required|email|unique:users,email,'.$this->input['id'];
else:
self::$rules['username'] = 'required|unique:users';
self::$rules['email'] = 'required|email|unique:users';
endif;
}
public static $rules = array(
'company_id' => 'required',
'role' => 'required',
'password' => 'sometimes|required|confirmed'
);
}
您需要使用self::
,因为$rules是静态的。
我已经移动了这个函数:
public function passes($id)
{
$rules = static::$rules;
$rules['username'] = str_replace('{id}', $id, $rules['username']);
$rules['email'] = str_replace('{id}', $id, $rules['email']);
$validation = 'Validator::make($this->attributes, $rules);
if($validation->passes()) return true;
$this->errors = $validation->messages();
return false;
}
并在抽象类Validator中对相同的函数进行了注释现在正在进行更新。
我在stackoverflow上以一种通用的方式解决了这个问题。如果您进行更新,它将自动调整您的规则,并在必要时向:unique
添加异常。