草庐IT

php - 在 laravel 中记录用户操作

coder 2024-04-13 原文

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

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

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

EventServiceProvider.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');
    }
}

记录一个 Action :

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

我仍在尝试将注意力集中在服务提供商身上,所以我在这里可能会非常离谱。

我的问题:

1) 服务提供商是正确的使用方法吗?

2) 是否有更好的方法不需要每次都手动将 Auth::user() 传递给事件?

3) 应该在什么级别触发事件?我尽可能倾向于模型,因为它会提供来自批量操作的更有用的日志。否则还有 Controller 或存储库。

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

5) 我对用户操作记录的搜索一直没有结果。这只是开发人员不做的事情吗?如果是,他们做什么

最佳答案

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

是的,使用服务提供商 来引导事情是个好主意,但不是必需的。如果您愿意,您可以完全排除 EventServiceProvider 服务提供商,并可以使用以下命令从您的 app/start/global.php 文件中执行相同的操作:

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

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

Is there a better approach that doesn't require manually passing Auth::user() to the event every time?

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

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

这是一种不同的情况,但是 Laravel 提供了一种很好的方法,当您在 __constructor< 中键入任何依赖项时,使用="">IoC 容器自动解析依赖项 类,例如:

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

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

At what level should events be fired? I'm leaning towards model whenever possible, as it would provide more useful logs from bulk actions. Otherwise there's the controller or repository.

对此没有级别,这取决于您的需要和偏好,也可能取决于应用程序的架构。实际上,您甚至可以在不使用 events 的情况下构建您的应用程序。

These events are only necessary in the admin area (/admin/*). Would it be beneficial to somehow restrict this to only that section of the site?

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

My searches regarding the logging of user actions have been very unfruitful. Is this just something developers don't do? If so, what do they do?

不完全确定您在说什么,但如果您在谈论用户操作的日志记录,那么答案是:取决于。我曾为一家旅行社做过一次,在他们的应用程序中,用户操作的 logging 非常重要,所以我几乎记录了用户在登录后所做的所有事情,例如:从客户、售票员、他们的(员工/用户)登录in/out,以便上级机构可以检查他们的事件。

不要犹豫别人做什么,找出你需要做什么,了解你的需求并据此开发。

关于php - 在 laravel 中记录用户操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24224175/

有关php - 在 laravel 中记录用户操作的更多相关文章

  1. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  2. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  3. ruby-on-rails - Rails 5 Active Record 记录无效错误 - 2

    我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa

  4. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  5. ruby - RVM "ERROR: Unable to checkout branch ."单用户 - 2

    我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas

  6. ruby-on-rails - 事件记录 : Select max of limit - 2

    我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).

  7. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  8. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  9. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  10. Ruby 守护进程导致 ActiveRecord 记录器 IOError - 2

    我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame

随机推荐