在laravel中记录用户操作


Logging user actions in laravel

我正试图将用户所做的所有操作(登录/注销/CROD(记录到数据库中的日志表中,从我所看到的情况来看,事件似乎是正确的方法。

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

到目前为止,我得到的是:

EventServiceProvider.php

namespace App'Events;
use Illuminate'Support'ServiceProvider;
class EventServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->events->subscribe(new UserEventSubscriber);
    }
}

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( 我对用户操作日志的搜索一直没有结果。这只是开发人员不做的事情吗?如果是,做什么

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);

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

有没有更好的方法不需要手动传递是否每次都将Auth::user((添加到事件?

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

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

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

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,这样上级就可以检查他们的活动。

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

您可以使助手函数像一样

function LogSystem($table,$action,$custom=null)
{
    $table::$action(function ($service) use ($action,$custom){
        if( ! is_null($custom))
        {
            $url='/panel/'.$custom.'/'.$service->id.'/edit';
        }
        else
        {
            $url='Illuminate'Support'Facades'Request::fullUrl();
        }
        'Illuminate'Support'Facades'DB::table('log_activity')->insert([
            'subject' => $action.'::=='.$service->title,
            'url' => $url,
            'method' => 'Illuminate'Support'Facades'Request::method(),
            'agent' => 'Illuminate'Support'Facades'Request::header('user-agent'),
            'ip' => 'Illuminate'Support'Facades'Request::ip(),
            'created_at'=>'Carbon'Carbon::now(),
            'user_id' => auth('admin')->check() ? auth('admin')->user()->id : 1,
        ]);
//
    });
}

然后转到服务提供商

LogSystem(''App'Services','created','services');

您可以将其用于任何模块的所有crud系统