Laravel - 停止并发访问记录

2024-05-17

在 Laravel 中,有什么方法可以停止同时与同一条记录交互。例如,如果用户 A 正在编辑一条记录,那么我同时需要阻止用户 B 编辑同一条记录。

注意:我在 Laravel 5.2 中使用 SESSION DRIVER=file

目前大约有 500 多名用户在使用该系统,它是一种管理面板,管理员可以在其中与记录进行交互,但我需要停止并发访问。最佳解决方案是什么?


这是我如何实现这一目标的。

1) 创建迁移以在模型中添加 2 列is_editing and editing_by and updated_at(无需创建updated_at如果已经在那里)

2)制作中间件php artisan make:middleware StopConcurrentOperations.

3)注册中间件app/Http/Kernel.php under $routeMiddleware.

4)将中间件应用到控制器

$this->middleware('concurrent.operations',["only"=>["edit","update"]]);

5) 阻止中间件中的并发编辑

<?php

namespace App\Http\Middleware;

use App\OperationActivity;
use Carbon\Carbon;
use Closure;
use Illuminate\Support\Facades\Auth;

class StopConcurrentOperations
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        $operation_id = current($request->route()->parameters());
        $user_id = Auth::guard('admin')->user()->id;
        if(Auth::guard('admin')->user() && !empty($operation_id)){
            $activity = OperationActivity::firstOrNew(["operation_id" => $operation_id]);
            if($activity->is_editing && $activity->updated_at->diffInMinutes(Carbon::now())<5 && $activity->editing_by!=$user_id)
                abort(409);
            else {
                $activity->is_editing = true;
                $activity->editing_by = $user_id;
                $activity->save();
            }
        }
        return $next($request);
    }
}

在这里我检查是否有人已经编辑记录并检查执行编辑的时间。

6) 如果编辑用户关闭窗口,则可以选择在客户端,然后取消阻止记录,例如

  window.onbeforeunload = function() {
    var url = "{{route('unlock_route_name',$operation->id)}}";
    $.ajax({ url: url, method: 'post' })
  };

要从客户端完成该过程,您必须创建一个route and a method在控制器中,只需解锁记录即可

      $operation = Operation::findOrFail($id);
      $activity = $operation->activities()->where("is_editing",true)->first();
      $activity->is_editing = false;
      $activity->save();

注意:在我的示例中,我已经有不同的表来记录活动OperationActivity可能的型号名称是Operation

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel - 停止并发访问记录 的相关文章

  • Laravel Nova:如何显示二进制字符串中的图像?

    我将 PNG 的二进制内容保存在数据库中 我想在页面上显示这个 PNG 而不需要在磁盘上临时保存文件 我认为需要生成 img 标签 例如 img src
  • 在 Kohana 中,可以触发 404 错误吗?

    我有一个名为articles 它创建从数据库获取相关数据的文章模型 我想 如果我调用的方法返回false 触发 404 错误 这是我到目前为止所拥有的 articleName this gt uri gt segment articles
  • 使用 PDO 准备语句使用搜索字段中的多个关键字进行 LIKE 查询

    网站用户使用搜索表单来查询产品数据库 输入的关键字在数据库中搜索产品的标题 public function startSearch keywords keywords preg split s keywords totalKeywords
  • 通过jquery传递搜索参数

    我有一个表单 如果用户输入搜索查询 其参数应通过 jquery 传递 并在获取结果后将结果加载到 div 容器中 由于我不太熟悉 jquery 我该怎么做 html currently the data is being displayed
  • 我如何知道请求是否来自 flash swf?

    我有一个用 flash 开发的应用程序 我需要访问一些 php 文件 因此 如果访问来自 swf 则 php 文件会返回一些数据 如何判断请求是否来自Flash 无需将 get post 变量传递给 php 可能是用户代理 推荐人 请记住
  • Ubuntu 18.04升级后php7.2-curl无法安装

    今天从 16 04 升级到 18 04do release upgrade d 在升级过程中 我被告知一些软件包将被删除 其中包括 删除 libperl5 22 lxc common perl modules 5 22 php imagic
  • 访问 public_html 级别之外/以下的文件

    如何通过 url 访问文件 home uzair etc index php 即使我运行域 something com 它显示了 home uzair public html index php 这个文件 任何人请帮助我如何访问放置在 ho
  • Laravel Sum 列数据库 Eloquent

    尝试获取我的一个表中 int 字段的总和应该非常容易 不幸的是 事实并非如此 因为无论我使用 Laravel MySQL 还是 Excel 我都会得到不同的结果 Laravel 5 4 给了我20506 Table sum field na
  • 如何比较两个字符串的大小写和变音符号不敏感?

    我有两根弦 字符串 1 塞巴斯蒂安 字符串 2 塞巴斯蒂安 我想通过忽略 重音 字符来比较这两个字符串 谁能知道这个逻辑吗 提前致谢
  • PHP:如何防止不必要的换行

    我正在使用 PHP 创建一些基本的 HTML 标签始终相同 但实际链接 标题对应于 PHP 变量 string p a href strong i title i i strong a br echo string fwrite outfi
  • 将 PHP mcrypt 与 Rijndael/AES 结合使用

    我正在尝试使用 php 中的 mcrypt 和密码 Rijndael 加密一些文本消息 但我不确定 MCRYPT MODE modename 根据 PHP 手册 这些可用 ecb cbc cfb ofb nofb 或 stream 但我读到
  • PHP 的 PDO 可以限制为单个查询吗?

    PHP 的 PDO 允许通过 query 方法或作为准备好的语句同时执行多个查询 以下两个示例均有效 Two SQL queries query SELECT FROM table DROP table Execute via query
  • 通过 AJAX 发送 XML

    我在 jQuery 中创建了一个 xml 文档 如下所示 var xmlDocument
  • PHP/MySQL:如何在网站中创建评论部分[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我不会问 如何使用 PHP MySQ
  • 使用php将文本文件转换为xml?

    data txt ha15rs 250 home2 gif 2 ha36gs 150 home3 gif 1 ha27se 300 home4 gif 4 ha4678 200 home5 gif 5 我想使用 php 使用 simplex
  • 如何使用 PHP 从 MySQL 检索特定值?

    好吧 我已经厌倦了 过去一周我花了大部分空闲时间试图解决这个问题 我知道 SQL 中的查询已更改 但我无法弄清楚 我能找到的所有其他帖子似乎都已经过时了 如果有人能帮助我 我将非常感激 我想做的就是使用手动输入数据库的唯一 密码 来检索行的
  • 如何使用 PHP 获取列中的所有值?

    我一直在到处寻找这个问题 但仍然找不到解决方案 如何从 mySQL 列中获取所有值并将它们存储在数组中 例如 表名称 客户 列名称 ID 名称 行数 5 我想获取此表中所有 5 个名称的数组 我该如何去做呢 我正在使用 PHP 我试图 SE
  • Laravel Blade 比较两个日期

    我想比较 2 个日期 因此 我在模板刀片中创建了这样的条件 if Carbon Carbon parse contrat gt date facturation gt format d m Y lt dateNow td class dan
  • 无法与站点通信以检查致命错误

    无法与站点通信以检查致命错误 因此 PHP 更改已恢复 您需要通过其他方式上传 PHP 文件更改 例如使用 SFTP 有什么解决办法 我正在 WordPress 中编辑头文件 遇到这个问题 尝试这个 我有同样的问题并决定调查一下 更改 wp
  • 禁用/启用用户访问/下载,但允许 php 编辑 - 使用 chown 和 chmod

    我想 move uploaded files到某个文件夹 比方说http localhost myproject protected 并且 PHP 应该能够rm mv cp 里面的一切protected 例如 启用 禁用用户对任何文件的访问

随机推荐

  • 启用声纳 python 时 SonarQube 扫描仪执行期间出错

    我是一个非常新的 sonarqube 用户 正在尝试我的 python 项目 我已经安装了 docker Sonarqube 映像 其中安装了 Sonarpython 插件 我安装了 Linux 基础声纳扫描仪 Using these ht
  • 如何清除代码中的 NSLog 输出?

    有没有办法清除代码中的控制台输出 thanks 我喜欢的快捷方式 Simply USE K Keyboard Shortcut when you want to clear the NSLOG Data
  • 子序列和

    给定一个整数数组 例如 1 2 3 1 查找是否存在总和为0并返回它 例如 1 2 3 or 2 3 1 检查每个子序列是O n 2 这效率太低了 有改进的想法吗 创建一个新数组 其中每个元素等于前一个元素加上该元素的总和 Input 1
  • MVC 3 DropDownFor 和 ViewModel 不起作用

    我有 2 个型号 public class Person public Guid ID get set public string Name get set public class Event public Guid ID get set
  • 在powershell中,使用export-csv cmdlet,我的整数被引号封装,知道为什么吗?

    所以我运行一个sql查询 通过管道传输到export csv 唯一的问题是所有值都用引号封装 包括整数 这对我来说不可能作为整数重新导入到SQL中 有什么想法吗 CSV 没有类型的概念 它是纯粹基于字符串的格式 PowerShell 只引用
  • Android 上的 PlusOneButton 如何知道用户是否已点击?

    在我的 Android 应用程序中 我可以点击 Google 1 按钮 这与开发人员源材料中的以下代码配合得很好 https developers google com mobile android recommend https deve
  • 从 IOS 应用程序注销的完美方法是什么?

    下面的代码可以工作 但有一个错误 场景是 我首先登录进入应用程序系统 登录成功后 应用程序将设置 UserDefaults UserId 之后 我可以使用存储的 UserId 导航应用程序视图 一旦我进入设置和选项卡注销 这将清除 User
  • RegularExpressionValidator.ValidationExpression 强制长度为 10 或 12 个符号

    RegularExpressionValidator ValidationExpression d 10 仅表示数字 最多 10 位 RegularExpressionValidator ValidationExpression d 10
  • 我可以使用 jpeg 图像来启动 Screen

    我目前正在进行应用程序开发 并且添加了一个 JPEG 格式的启动器屏幕 该屏幕在模拟器和设备中都显示 但这是否会对苹果批准指南产生任何问题 iOS 8 更新 您现在可以使用基于 XIB 的启动资产 https developer apple
  • 什么是仅匹配空字符串的正则表达式?

    有很多关于正则表达式的帖子来匹配潜在地空字符串 但我找不到任何提供正则表达式的字符串only匹配一个空字符串 我知道 将匹配任何行的开头并且 将匹配任何行的结尾以及字符串的结尾 像这样 匹配的内容远不止空字符串 如 n foobar n n
  • Python 循环的列表理解

    我使用了很多 N 维数组 编写这样的缩进代码会很痛苦 而且我知道有些代码可以用列表理解和内联语句替换 例如 for x in 0 1 2 3 for y in 0 1 2 3 if x lt y print x y x y 可以替换为 pr
  • 如何重命名 MySQL 数据库(更改架构名称)?

    如何快速重命名 MySQL 数据库 更改其架构名称 通常我只是转储数据库并使用新名称重新导入它 对于非常大的数据库来说 这不是一个选项 显然RENAME DATABASE SCHEMA db name TO new db name 做了坏事
  • 安卓默认主题

    我正在制作一个 Android 应用程序 但我正在考虑主题 如果我不声明 Android 应用程序的主题 将使用哪个主题 我在哪里可以找到这些信息 使用其中之一和其他的标准是什么 我在想 如果我想自定义我的所有应用程序 我必须扩展一个主题并
  • 将列名称与具有 AJAX 数据源的 DataTable 一起使用

    我正在尝试升级我的系统以使用 DataTables 1 10 而不是 1 9 并且我正在尝试找到一种使用 JSON 对象而不是列表传回行内容的方法 具体来说 而不是以格式传回数据 data data data data data data
  • 如何修复 IE6 上的不透明度

    如何修复 IE6 上的不透明度 此代码不适用于 IE6 filter alpha opacity 50 moz opacity 0 5 khtml opacity 0 5 opacity 0 5 还有这段代码 description ani
  • ORA-00933 与内部联接和“as”混淆

    我有一个使用以下命令从两个表中获取数据的查询inner join 但我收到错误SQL command not properly ended as 下面有一个星号 select P carrier id O order id O aircra
  • “WSGIRequest”对象没有属性“successful_authenticator”

    我已经创建了一个像这样的身份验证类 RESTful API 的令牌身份验证 是否应该定期更改令牌 https stackoverflow com questions 14567586 token authentication for res
  • 如何修复 Visual Studio 2010 中的错误 MSB4018?

    error MSB4018 The VCMessage task failed unexpectedly System FormatException Index zero based must be greater than or equ
  • 无法在类上找到适当的构造函数

    我正在尝试将本机 SQL 结果映射到 POJO 但它返回错误 这是完整的堆栈跟踪 Hibernate SELECT FROM members tb where memberName like 2019 12 19 07 40 20 688
  • Laravel - 停止并发访问记录

    在 Laravel 中 有什么方法可以停止同时与同一条记录交互 例如 如果用户 A 正在编辑一条记录 那么我同时需要阻止用户 B 编辑同一条记录 注意 我在 Laravel 5 2 中使用 SESSION DRIVER file 目前大约有