2014-10-05 3 views
2

нужна помощь в обновлении уникального правила в моих правилах проверки. У меня есть абстрактный валидатор, который будет проверять правила перед хранением в моей базе данных, а в массиве правил я устанавливаю, что электронное письмо является уникальным при создании или регистрации пользователя, но при обновлении пользователя электронное письмо не должно проверять, принадлежит ли электронное письмо Пользователь.Laravel 4 Уникальные правила валидации не работают

абстрактный класс Validator

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; 
    } 
} 

Validation Rules (UserRule.php)

use MyCustomValidatorNamespaceHere.... 

class UserRules extends Validator 

public function rules() 
{ 
    return [ 
     'email' => 'required|email|unique:users,email,id', 
     ... 
    ]; 
} 

и в моем UserController я вводил UserRule в constractor. (UserRule $ userRule). Вот код в методе обновления.

public function update($id) 
{ 
    $if ($this->userRule->passes()) 
    { 
     $this->user->find($id)->update(Input::all()); 
     return ......... 
    } 
} 

Но валидация всегда терпит неудачу и отображает сообщение об ошибке, что письмо уже выполнено. Пожалуйста, помогите парням.

+0

Я решил эту проблему [здесь на StackOverflow] (http://stackoverflow.com/a/28254548/1532168) в общем виде. Он автоматически адаптирует ваши правила, если вы сделаете обновление, и при необходимости добавьте исключения в свой ': unique'. – cgross

ответ

4

Проблема заключается в вашем правиле. Когда вы обновляете, вам нужно использовать 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

+0

Как насчет того, если у меня будет больше уникальности, которая должна быть исключена при обновлении. Думаю, я должен добавить его снова в методе проходов? – piso

+0

@piso Для уникальной вы можете использовать только один идентификатор не так много. Вы должны отредактировать только одну запись сразу, так что этого достаточно. –

+0

Как насчет обновления имени пользователя? имя пользователя также уникально. – piso

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::, потому что $ правила является статическим.

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 Теперь ОБНОВЛЕНИЕ работает.

-1

Я решил эту проблему here on stackoverflow в общем виде. Он автоматически адаптирует ваши правила, если вы сделаете обновление, и добавьте исключения в ваш :unique, если это необходимо.

0

Вы можете использовать метод route внутри класса запроса к кроме идентификатор из проверки

public function rules() 
{ 
    return [ 
     'email' => 'required|email|unique:users,email,'.$this->route('user'), 
     ... 
    ]; 
} 
Смежные вопросы