2014-07-26 48 views
0

如何在提交按鈕非常快速地點擊時防止多個提交?防止使用Laravel 4創建多個條目

這是我store功能:

public function store() 
{ 
    $input = Input::except('_token'); 
    $country = new Country($input); 

    $country->save(); 
} 

我想過添加驗證的唯一的ID。但我認爲如果同一個方法執行多次,每個Country實例將會不同,因此會有不同的ID,因此無論如何都會創建該條目。無論如何,我不喜歡爲這種情況使用驗證的想法。

我有一些圍繞更新實體時,防止多次提交:

public function updatePost(Post $post) { 
    if (count($post->getDirty()) > 0) { 
     $post->save(); 
     return Redirect::back()->with('success', 'Post is updated!'); 
    } else { 
     return Redirect::back()->with('success', 'Nothing to update!'); 
    } 
} 

然而,getDirty()不會存儲一個新的實體,當有任何幫助。

我一直在尋找一段時間,我沒有找到任何直接前進。

處理這個問題的常用方法是什麼?

編輯。嘗試使用Redirect::route(),但我得到了相同的結果。

+0

重複http://stackoverflow.com/questions/17239586/laravel-4-prevent-multiple-form-submissions-csrf-token? – Unnawut

+0

我看到了,它並沒有幫助。 – dabadaba

+0

對答案有評論,說答案中的選項不是選項。需要完成'session :: put('_ token',sha1(microtime()))和'Redirect :: route('form/success') - >'(with「data」,$ myData)。順便說一下,你需要在'store()'的開頭執行'Session :: put('_ token',sha1(microtime()))''。 – Unnawut

回答

0

我認爲你可以/應該在這裏考慮一些方法的組合。

首先,我肯定會說實施唯一性的模型規則可以用來保護您應用程序的數據完整性。

其次,爲了防止這種情況發生,您可能需要查看一個簡單的Javascript函數,該函數會禁用一次單擊的Submit按鈕。

+0

依靠JavaScript來處理這種事情是一個可怕的想法,因爲用戶可以禁用它並且問題會持續存在 – dabadaba

0

這裏是我的方法:

public function store() 
{ 
    $input = Input::except('_token'); 
    $host = gethostname(); 

    // Using -1 for $last_update will always ensure that the next line is true if no 
    // entry exists 
    $last_update = Session::has($host) ? Session::get($host) : -1; 

    // If no entry exists (-1), then the below statement will always be true! 
    $allow_entry = (microtime() - $last_update) > $SOME_TIME; 

    if ($allow_entry) 
    { 
     $country = new Country($input); 
     $country->save(); 

     // Only update the Session if an entry was inserted 
     Session::put($host) = microtime(); 
    } 
} 

基本上,你用Session鍵爲用戶的hostname。而價值是進入的時間。