gpt4 book ai didi

php - 在 laravel 中记录用户操作

转载 作者:可可西里 更新时间:2023-10-31 22:43:18 26 4
gpt4 key购买 nike

我正在尝试将用户执行的所有操作(登录/注销/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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com