2016-07-19 221 views
0

我很困惑,自定義驗證規則是否需要返回true或false來觸發。Laravel 4自定義驗證規則

我正在驗證一個電子郵件地址,以確保它已通過關係屬於另一個模型。

Validator::extend('email_exists', function($attribute, $value, $parameter){ 
     $user = User::where('email', '=', $value)->with('clients')->first(); 
     //Does the user exits, and are they already a member of this client? 
     //We know this by looking at the client id, and comparing them the current ID. 
     if($user != NULL) { 
      if(in_array(Input::get('client_id'), $user->clients->lists('id'))) { 
       return false; 
      } else { 
       return true; 
      } 
     } else { 
      return true; 
     } 

}); 

什麼我想上面,發現如果用戶使用輸入的電子郵件是否存在,如果它確實存在,然後檢查電子郵件與任何客戶,而如果這些客戶端的ID匹配客戶端ID在POST中,如果電子郵件存在並且與POST中的客戶端ID相關我想返回一個錯誤,其他明智的我很高興POST處理。

目前,我認爲我允許任何事情通過。我是否正確使用自定義規則,如果我想拋出錯誤,應該返回什麼?

+0

它看起來是正確的,你把這個代碼放在服務提供者中嗎?如果是這樣的話,你是否記得在'config/app.php'中將服務提供者添加到提供者數組? – user3158900

+0

目前在我的控制器中是直的。 – Udders

+0

只要確保它在表單提交的控制器部分中,而不是負責構建表單的部分?在設置'$ user' var之前,也可以嘗試添加'dd('test');'以查看它是否進入該部分。 – user3158900

回答

0

我認爲你正在接近這個錯誤的方式。除了爲單個用例擴展Validator類的壓力之外,您應該考慮簡單地將消息添加到消息包中,並將輸入元素作爲關鍵字。例如

$validator->messages()->add('client_id', 'This email is already associated with a client'); 

提示:我通常是一個規則陣列添加到我的模型和注入Validator類,所以我可以很容易地驗證模型,而無需創建Validator的實例,或者寫一個規則陣列中的所有的時間。