2016-06-12 94 views
0

編輯我在找強制執行Laravel形式請求是唯一的領域,除了編輯時的最佳方式時。最明顯的例子是隻允許一次使用電子郵件地址,即系統中的每個用戶都需要一個唯一的電子郵件地址。獨特的領域在Laravel 5

這是直接的通過使該領域唯一實現使用表單請求,:

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

這使得所需的領域,作爲驗證電子郵件,使得它在用戶的表是唯一的。適合創建新用戶。但是編輯呢?用戶想要編輯他們的個人資料並再次保存相同的電子郵件地址(這是完全有效的)是完全合理的。但是,當然,unique規則將觸發,因爲電子郵件已被「使用」(儘管用戶試圖編輯自己)。

Laravel提供瞭解決的辦法,通過在user表的ID傳遞給忽略:

'email' => ['required', 'email', 'unique:users,email,'.$userId] 

可是如何才能讓用戶ID?也許這是一個不好的例子,因爲獲取登錄的用戶ID很簡單,但其他對象沒有存儲在會話中呢?

如果一個人使用REST,那麼對象的ID將使用路由的URL和可用:

$userId = $this->route('order'); 

但這似乎很髒。那麼你還沒有使用REST修改對象的其他實例呢?如何在Laravel 5中編輯對象時強制表單請求中的唯一性?

回答

1

如果需要,您可以使用不同規則的2個表單請求。我不認爲從FormRequest獲取信息來調整規則是不夠的,因爲FormRequest是一個請求,您可能需要一些信息來決定如何進行驗證或授權。

我有一個關於使用FormRequest用於創建和更新,使用規則獨特的規則,使用路由參數追加到獨特的規則後。 asklagbox - blog - Form Request for Store and Update

它使用HTTP方法來知道它是否用於存儲或更新,如果它是更新發生(Rest),則附加到唯一規則。如果你沒有使用REST,你仍然可以這樣做,你只需要檢查除HTTP方法以外的東西,知道這是用於存儲還是更新。如果需要,您可以調整此方法以檢查輸入值而不是添加到唯一規則的路由參數。由於FormRequest對於資源來說非常具體,因此您並不需要瘋狂並想到每個可能的其他方式都需要做某些事情,否則您的應用程序/ API可能開始變得不一致。

// added to base FormRequest 

protected $updateMethods = ['PUT', 'PATCH']; 

protected function appendUnique($key, $keyName = 'id') 
{ 
    if (in_array($this->method(), $this->updateMethods) && $param = $this->route($key)) { 
     if ($param instanceof Model) { 
      $rt = "{$param->getKey()},{$param->getKeyName()}"; 
     } else { 
      $rt = "{$param},{$keyName}"; 
     } 
     return ','. $rt; 
    } 
} 

然後在你的FormRequest規則方法的數組將有這樣的事情:

'email' => 'required|unique:users,email'. $this->appendUnique('user'), 

我用路線模型綁定(顯性和隱性),通常這就是爲什麼這是設置這樣和很少會有我檢查的資源通過輸入而不是路由參數傳遞。

我希望這會有所幫助。