在laravel中记录用户操作

wol*_*emm 4 php laravel

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

did($action)在User模型中添加了一个方法,该方法将动作记录到给定用户的数据库中.

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

EventServiceProvider.php

namespace App\Events;

use Illuminate\Support\ServiceProvider;

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

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');
    }
}
Run Code Online (Sandbox Code Playgroud)

要记录操作:

Event::fire('user.logout', array(Auth::user()));
Run Code Online (Sandbox Code Playgroud)

我仍然试图围绕服务提供商,所以我可能会非常偏向于此.

我的问题:

1)服务提供商是正确使用的还是这个?

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

3)事件应在什么级别被解雇?我尽可能倾向于模型,因为它可以从批量操作中提供更多有用的日志.否则就是控制器或存储库.

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

5)我对用户操作记录的搜索非常没有用.这只是开发人员不做的事吗?那么,是什么他们做什么?

The*_*pha 7

Is a service provider the right thing to use or this?
Run Code Online (Sandbox Code Playgroud)

是的,使用service provider引导的东西是一个好主意,但不是必需的.如果你想要,你可以完全排除,EventServiceProvider service provider并可以app/start/global.php使用以下文件从你的文件做同样的事情:

$app->events->subscribe(new Events\UserEventSubscriber);
Run Code Online (Sandbox Code Playgroud)

因为它$app是一个全局变量,所以你可以在这里使用它,但它不是一个更简洁的方法在this(global.php)文件中执行此操作,但是service provider只是一种干净利落的方式来引导事物(比如包括php文件使用include "someClass.php"),因为Laravel调用register方法定义了service provider在框架启动过程中的每个类,这样开发人员可以在应用程序调度路由之前做一些bootstraping/initializing/includes等事情.

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

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

public function login()
{
    return \Auth::user()->did('logged_in');
}
Run Code Online (Sandbox Code Playgroud)

这是一个不同的情况,但Laravel提供了一种IoC__constructor类中转换任何依赖项时使用容器自动解析依赖关系的好方法,例如:

class SomeClass {
    public function __construct(User $user)
    {
        $this->use = $user;
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您不需要User在使用此类时传递该类,因为IoC容器可以在框架实例化时自动注入依赖项,但在您的情况下,依赖性是Auth::user()/looged in user这样,所以它有点不同,所以手动执行或使用Auth::user()->did()直.

应该在什么级别解雇事件?我尽可能倾向于模型,因为它可以从批量操作中提供更多有用的日志.否则就是控制器或存储库.

没有level这个,它取决于您的需求和偏好以及应用程序的架构.实际上,您甚至可以在不使用的情况下构建应用程序events.

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

也许你可以但不需要,不是很重要IMO.

我对用户操作记录的搜索非常没有用.这只是开发人员不做的事吗?如果是这样,他们做了什么?

不完全确定你在谈论什么,但如果你在谈论logging用户行为,那么答案是:depends.我曾经为一家旅行社做过一次,在他们的应用程序中logging,用户操作非常重要,所以我记录了用户在登录后几乎所做的一切,例如:从客户那里收到付款,卖票,他们(员工/用户)登录in/out所以更高的权限可以检查他们的活动.

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