нужна помощь в обновлении уникального правила в моих правилах проверки. У меня есть абстрактный валидатор, который будет проверять правила перед сохранением в моей базе данных, и в массиве правил я задаю адрес электронной почты как уникальный при создании или регистрации пользователя, но при обновлении пользователя сообщение eique не должно проверяться, если письмо принадлежит владельцу Пользователь.
абстрактный класс валидатор
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 .........
}
}
Но при проверке всегда происходит сбой и отображается ошибка, что электронное письмо уже занято. Пожалуйста, помогите, ребята.
Проблема в твоем правиле. При обновлении нужно использовать unique
это не проверяет запись, которую вы обновляете. Итак, вы должны иметь:
unique:users,email,id
но например:
unique:users,email,10
если вы редактируете запись с идентификатором 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
метод внутри вашего класса запроса, кроме идентификатора из проверки
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;
}
в UserRule.php и прокомментировал ту же функцию в абстрактном классе Validator
Сейчас обновление работает.
Я решил эту проблему здесь на стеке потока в общем виде. Он автоматически адаптирует ваши правила, если вы сделаете обновление и добавите исключения к вашему :unique
если необходимо.