需要帮助更新验证规则中的唯一规则。我有一个抽象验证器,它将在存储到我的数据库之前验证规则,在规则数组中,我将电子邮件设置为在创建或注册用户时是唯一的,但在更新用户时,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中,我在绑定器中注入了UserRule。 (UserRule $ userRule)。这是更新方法中的代码。
public function update($id)
{
$if ($this->userRule->passes())
{
$this->user->find($id)->update(Input::all());
return .........
}
}
但验证始终失败并显示已收到电子邮件的错误。请帮帮我们。
答案 0 :(得分:4)
问题是你的规则。更新时,您需要使用不检查更新记录的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
答案 1 :(得分:1)
您可以在请求类中使用route
方法,但验证中的ID除外
public function rules()
{
return [
'email' => 'required|email|unique:users,email,'.$this->route('user'),
...
];
}
答案 2 :(得分:0)
之前我遇到过这样的问题,很难找到答案。这就是我做的。
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是静态的。
答案 3 :(得分:0)
我已经移动了这个功能:
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;
}
进入UserRule.php并在抽象类Validator中注释相同的函数 现在更新正在进行中。
答案 4 :(得分:-1)
我以通用的方式解决了这个问题here on stackoverflow。如果您进行更新,它会自动调整您的规则,并在必要时为:unique
添加例外。