在 Laravel 中记录用户操作

2024-05-06

我正在尝试将用户执行的所有操作(登录/注销/CRUD)记录到我的数据库中的日志表中,并且从我所看到的事件看来是执行此操作的正确方法。

我添加了一个did($action)User 模型的方法,它将给定用户的操作记录到数据库中。

这是我到目前为止所得到的:

事件服务提供者.php

namespace App\Events;

use Illuminate\Support\ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->events->subscribe(new UserEventSubscriber);
    }
}

用户事件订阅者.php

namespace App\Events;

class UserEventSubscriber
{
    public function login(\User $user)
    {
        return $user->did('logged_in');
    }

    public function logout(\User $user)
    {
        return $user->did('logged_out');
    }

    public function subscribe($events)
    {
        $events->listen('user.login', 'App\Events\UserEventSubscriber@login');

        $events->listen('user.logout', 'App\Events\UserEventSubscriber@logout');
    }
}

记录操作:

Event::fire('user.logout', array(Auth::user()));

我仍在努力将注意力集中在服务提供商身上,所以我在这里可能会大错特错。

我的问题:

1) 服务提供商是正确的选择吗?

2)有没有更好的方法,不需要手动传递Auth::user()每次都去参加活动吗?

3)事件应该在什么级别被触发?只要有可能,我就倾向于模型,因为它会从批量操作中提供更有用的日志。否则有控制器或存储库。

4) 这些事件仅在管理区域(/admin/*) 中是必需的。以某种方式将其仅限于网站的该部分是否有益?

5)我对用户操作记录的搜索非常没有结果。这只是开发商不做的事情吗?如果是这样,什么do他们是这样?


Is a service provider the right thing to use or this?

是的,使用service provider用于引导事物,但不是必需的。如果您愿意,您可以完全排除EventServiceProvider service provider并可以从你的做同样的事情app/start/global.php使用此文件:

$app->events->subscribe(new Events\UserEventSubscriber);

Since $app是一个全局变量,所以你可以在这里使用它,但这不是一个更干净的方法(global.php)文件但是一个service provider只是一种简洁明了的方式来引导事物(例如包括php文件使用include "someClass.php")因为Laravel称为register每个中定义的方法service provider在框架的启动过程中,开发人员可以在应用程序分派路由之前执行一些引导/初始化/包含等操作。

有没有更好的方法不需要手动传递 每次都对事件进行 Auth::user() 吗?

还有其他方法,但在这种情况下,请坚持使用当前的方法,因为依赖关系是Auth::user()意味着当前登录的用户,所以最好手动传递使用,或者您也可以使用\Auth::user()->did()直接这样:

public function login()
{
    return \Auth::user()->did('logged_in');
}

这是一个不同的情况,但是Laravel提供了一种使用以下方法自动解决依赖关系的好方法IoC容器,当您键入强制转换任何依赖项时__constructor类,例如:

class SomeClass {
    public function __construct(User $user)
    {
        $this->use = $user;
    }
}

在这种情况下,您不需要通过User当您使用此类时,因为IoC当框架实例化容器时,容器可以自动注入依赖项,但在您的情况下,他的依赖项是Auth::user()/looged in user所以这是有点不同的事情所以手动做或使用Auth::user()->did()直接地。

应该在什么级别触发事件?我倾向于模特 只要有可能,因为它将提供更多有用的批量日志 行动。否则有控制器或存储库。

没有level为此,这取决于您的需求和偏好,也许还取决于应用程序的架构。实际上,即使不使用,您也可以构建您的应用程序events.

这些事件仅在管理区域 (/admin/*) 中是必需的。会吗 以某种方式将其仅限于该部分是有益的 地点?

也许可以,但没必要,没什么大不了的IMO.

我对用户操作记录的搜索非常多 没有成果。这只是开发商不做的事情吗?如果是这样,该怎么办 他们是这样?

不完全确定你在说什么,但如果你在谈论logging用户操作,那么答案是:depends。我曾经为一家旅行社做过一次,在他们的申请中logging用户操作的数量非常重要,因此我记录了用户登录后所做的几乎所有操作,例如:接收客户的付款、出售门票、他们的(员工/用户)日志in/out以便上级当局可以检查他们的活动。

不要犹豫别人在做什么,找出你需要做什么,了解你的要求并相应地发展。

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

在 Laravel 中记录用户操作 的相关文章

随机推荐

  • 检查对象是否具有属性,而不依赖于“__getattr__”

    有没有一种方法可以检查对象是否具有不依赖于的属性 getattr 或对象实现细节 考虑下面的代码 我想Proxy委托给Wrapped它无法处理什么 该代码有效 但我想避免测试attr in self dict 我更喜欢一个稳定的接口来执行此
  • 如何使用 SharpDX Toolkit 绘制透明 3D 对象?

    我正在开发一个使用 SharpDX 和 SharpDX Toolkit 来绘制简单 3D 形状的应用程序 Geometrics Desktop 示例对于入门非常有帮助 现在我正在尝试使某些形状透明 并且为了简单起见 我只是尝试使该示例中的茶
  • 复制键盘布局,向上推入底部表格

    当底部工作表打开时 有什么方法可以像 Android 键盘一样手动上推布局 滚动视图或回收器视图或整个活动 或者你可以说我想以底部表格的形式制作一个最小的键盘 不使用任何可编辑视图 100 工作配方 在 BottomSheetFragmen
  • 如何将 Java 客户端连接到 Windows 10 上的 Azure Cosmos db 模拟器,找不到证书

    Problem 我的演示代码客户端无法连接到 Windows 10 上的 Azure Cosmos 模拟器 Steps 我在 Windows 上安装了 Cosmosdb 模拟器 看起来不错 根据文档 我启动了 Windows cert ma
  • 将图像添加到 uitableview 单元格

    我有一个tableview 如何将图像添加到该单元格的左侧 cell imageView image UIImage imageNamed image png 更新 就像 Steven Fisher 所说 这应该只适用于具有 UITable
  • WPF 命令参数绑定问题

    我在理解命令参数绑定的工作原理时遇到一些困难 当我在调用 InitializeComponent 之前创建小部件类的实例时 它似乎工作正常 对 ExecuteCommand 函数中参数 Widget 的修改将 应用 到 widget 这是我
  • 程序如何在Python中的两个函数之间进行选择?

    我有一个 Python 3 2 程序 可以计算未来任意时间段内的投资价值 它可以处理单利和复利 问题是我定义了两个函数 main 和 main2 第一个是简单函数 第二个是复利函数 现在我想做的是 根据用户的一些输入 程序在运行 main
  • 为什么在 ruby​​ 中创建元类?

    我正在尝试了解 Ruby 对象模型 我知道实例方法保存在类中而不是类的对象中 因为它消除了冗余 我读到 每当创建一个类时 也会为新创建的类创建一个元类 元类存储类方法 即该类的单例方法位于元类中 例如 class MyClass def h
  • 这个程序中的“this”是什么意思?

    我正在编写一个程序 然后我在一些使用this这段代码中的关键字 我想知道它的目的是什么 它可以处理 Jbutton 或 JTextField 它可以使用 this 关键字显示消息 发生了什么getSource 这是代码 import jav
  • 如何使用 Selenium Webdriver 自动化验证码? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在为登录页面编写脚本 但我有一个验证码需要处理 Selenium 无法处理验证码 虽然网站出于同样的原因使用验证码 所以没有人可以
  • 导致链接平移并打开地图中的标记

    JSFiddle http jsfiddle net megatimes NVDLf 7 http jsfiddle net megatimes NVDLf 7 我有一张地图 它从数组创建多个标记 地图下方是一些链接 单击这些链接时 我想让
  • 更改 iOS 地图中的图钉方向

    环球银行金融电信协会3 0 MKMAP视图 iOS Note 融合的AppleMap 不与GoogleMap 我做了以下事情 实现地图并将自定义图像添加到用户位置注释 当地图打开时 它会在正确的位置显示用户位置 我的要求 当用户移动到不同方
  • Laravel 5.2 CORS,GET 不适用于预检选项

    可怕的 CORS 错误 跨源请求被阻止 同源策略不允许读取 远程资源位于http localhost mysite api test http localhost mysite api test 原因 CORS 标头 Access Cont
  • 如何防止查询字符串被篡改?

    Hii 我有一个像 http project page1 aspx userID 5 http project page1 aspx userID 5 如果手动更改 userID 参数 该操作将无法执行 这怎么可能 大家好 谢谢您的帮助 我
  • 如何在 Angular 6 单元测试中调试 HeadlessChrome 0.0.0 (Linux 0.0.0) ERROR { "isTrusted": true } ?

    当我运行测试套件时 我在与我一直在使用的单元测试完全不同的单元测试中遇到错误 我做错了什么 HeadlessChrome 0 0 0 Linux 0 0 0 ERROR isTrusted true 然后是一些构建步骤 并在测试执行期间出现
  • 动态创建结构的List<>

    在 C 中 我想创建一个基于动态值类型的列表 例如 void Function1 TypeBuilder tb tb is a value type Type myType tb CreateType List
  • 使用“旧”对象引用使用构建器模式创建新对象

    我正在尝试构建器模式 并陷入如何向新创建的对象添加新 属性 的困境 public class MsProjectTaskData private boolean isAlreadyTransfered private String req
  • CMake 错误:CMake 无法找到与“MinGW Makefiles”对应的构建程序

    我正在尝试使用 cmake 为 c 构建 Box2D 库 当我运行 cmake gui 时出现错误 CMake Error CMake was unable to find a build program corresponding to
  • svn 本地副本中修改的文件列表

    我使用 Tortoise 客户端签出 提交我对 SVN 的更改 但我发现这有点困难 因为我无法找到本地副本中更改的所有文件的列表 有什么捷径或者我忽略的东西吗 我是 SVN 新手 供参考 我不熟悉乌龟 但是对于 linux 的颠覆我会输入
  • 在 Laravel 中记录用户操作

    我正在尝试将用户执行的所有操作 登录 注销 CRUD 记录到我的数据库中的日志表中 并且从我所看到的事件看来是执行此操作的正确方法 我添加了一个did action User 模型的方法 它将给定用户的操作记录到数据库中 这是我到目前为止所