使用Laravel 4防止创建多个条目

时间:2014-07-26 19:18:58

标签: laravel 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(),但我得到了相同的结果。

2 个答案:

答案 0 :(得分:0)

我认为这里有一些方法可以/应该考虑。

首先,我肯定会说应用强制唯一性的模型规则可以保护应用程序的数据完整性。

其次,为了防止这种情况发生,您可能希望查看实现一个简单的Javascript函数,该函数在单击后禁用“提交”按钮。

答案 1 :(得分: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。而价值就是进入的时间。