2014-10-05 53 views
2

需要幫助更新我的驗證規則中的唯一規則。我有一個抽象驗證器,它將在存儲到我的數據庫和規則數組中之前驗證規則,我在創建或註冊用戶時將電子郵件設置爲唯一的,但在更新用戶時,如果電子郵件歸屬於用戶。Laravel 4獨特的驗證規則不起作用

抽象類驗證

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在constractor。 (UserRule $ userRule)。這是更新方法中的代碼。

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

但驗證總是失敗並顯示電子郵件已被採取的錯誤。請幫助傢伙。

+0

我解決了這個問題[這裏計算器(http://stackoverflow.com/a/28254548/1532168 )以通用的方式。如果您進行更新,它會自動調整您的規則,並在必要時爲「:unique」添加例外。 – cgross 2015-01-31 17:42:39

回答

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

+0

如果我有更獨特的更新時應該排除的情況如何。我想我應該再次在pass方法中添加它? – piso 2014-10-05 07:37:14

+0

@piso對於獨特的你只能使用一個id不是很多。您應該一次編輯一條記錄,這樣就足夠了。 – 2014-10-05 07:46:22

+0

如何更新用戶名?用戶名也是唯一的順便說一句。 – piso 2014-10-05 07:53:09

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和抽象類驗證 現在更新工作評價相同的功能。

-1

我在一個通用的方式解決了這個問題here on stackoverflow。如果你做一個更新,並在必要時添加例外您:unique它會自動適應你的規則。

0

您可以使用您的請求類裏面的route方法從驗證除外的ID

public function rules() 
{ 
    return [ 
     'email' => 'required|email|unique:users,email,'.$this->route('user'), 
     ... 
    ]; 
}