在laravel中记录用户操作

时间:2014-06-14 20:48:57

标签: php laravel

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

我在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)我对用户操作记录的搜索非常没有用。这只是开发人员不做的事吗?如果是这样,他们做了什么

2 个答案:

答案 0 :(得分:6)

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 providerphp只有一种干净利落的方式来引导事物(比如使用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; } } 容器自动解析依赖关系的好方法,例如:< / p>

User

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

  

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

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

  

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

也许你可以但不需要,而不是一件大事logging

  

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

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

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

答案 1 :(得分:0)

您可以像这样使助手功能

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

您可以针对任何所需模块的所有croud系统调用此