2014-09-21 122 views
1

只要掌握Laravel 4.2和口才。我一直在laracasts.com上從Scratch演員角度觀看Laravel,特別是關於驗證和後續重構的課程。這些課程中使用的示例處理相對基本的用戶模型,其中僅有2個字段,即用戶名和密碼。我的用戶模型包含更多字段,我的註冊表格要求用戶重新輸入/確認他們輸入的密碼。Laravel /雄辯:從模型內驗證

似乎建議驗證用戶輸入的過程應該在模型內完成,這是完全合理的。所以就像那個教程一樣,我已經提前向我的模型添加了一個isValid方法來驗證用戶在我的註冊表單上的輸入。我填基於輸入這樣我的用戶模型:

$input = Input::all(); 
if (!$this->user->fill($input)->isValid()) { 
    return Redirect::back()->withInput()->withErrors($this->user->errors); 
} 

所以我寫了我的規則,並得到了驗證工作,我現在已經準備好了用戶的輸入保存到數據庫中。然而,由於我已經填充了整個用戶輸入的模型,用戶模型實例現在包含confirm_password的屬性,並且調用$user->save();時給我一個錯誤(因爲我的數據庫表中沒有此字段)。另外,由於我剛剛通過用戶輸入驗證,所以密碼也不會被散列。

在驗證用戶輸入方面採取什麼樣的最佳方法VS具有模型實際上是否代表數據庫表?我知道有很多方法可以解決所有這些問題,比如將驗證移動到模型之外,也許只是讓模型存儲驗證規則等,但我可以在最佳實踐中尋找建議。

感謝

+0

您可以使用'mutator'來設置密碼散列和'saving'事件來取消設置'confirm_password'。但是,無論如何,我都不會在模型中進行驗證,而且您的'簡單'解決方案可能會被證明是不靈活的,並且比現在看起來更復雜。 – 2014-09-21 17:58:56

回答

2

您可以保存前將其刪除,例如:

$input = Input::all(); 
if (!$this->user->fill($input)->isValid()) { 
    return Redirect::back()->withInput()->withErrors($this->user->errors); 
} 
else { 
    unset($this->user->attributes['confirm_password']); 
    $this->user->save(); 
} 

這可能工作,但不這樣做的正確方法。您也可以使用節能event像:

// Goes in to your model 
protected static function boot() 
{ 
    parent::boot(); 
    static::saving(function($model) { 
     unset($model->attributes['confirm_password']); 
    }); 
} 

因爲你是你的模型裏面validationg那麼你可能觸發saving事件驗證,如:

protected static function boot() 
{ 
    parent::boot(); 
    static::saving(function($model) { 
     if($model->isValid()) { 
      unset($model->attributes['confirm_password']); 
      return true; 
     } 
     return false; 
    }); 
} 
+0

感謝您的回答。我認爲儲蓄事件將是最好的方法。也許我可以在保存之前使用它來散列我的密碼。在這種情況下,有一種方法可以檢查我的密碼是散列還是純文本(如果我從數據庫中檢索用戶,密碼屬性已經被散列)? – Jonathon 2014-09-21 18:09:13

+0

歡迎和是的,我認爲是這樣的:-) – 2014-09-21 18:11:29

+0

任何想法如何檢查一個字符串是否哈希然後呢?看看這個文檔,看起來'Hash'只有3個方法,'make','check'和'needsRehash' – Jonathon 2014-09-21 18:14:21

1

有更好的方法來完成這個相同事情。

  1. 限制您的輸入值。 您可以將Input :: all()傳遞給您的驗證器,並仍然執行此操作。

    $input = Input::only('username', 'password'); 
    // – OR – 
    $input = Input::except('confirm_password'); 
    
  2. 添加$fillable到您的用戶模型。

    class User extends Eloquent { 
        protected $fillable = array('id', 'name', 'email', 'password'); 
    } 
    

然後你可以從輸入填充數據庫,只可填寫排列的列將被填充。 如果您嘗試此操作,請確保您有良好的驗證規則。

$user = User::create(Input::all()); 

這將完成你正在嘗試沒有解封的輸入值或添加模型事件做。