我正在尝试将用户执行的所有操作(登录/注销/ 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)我对用户操作记录的搜索非常没有用。这只是开发人员不做的事吗?如果是这样,他们做了什么做?
答案 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 provider
是php
只有一种干净利落的方式来引导事物(比如使用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系统调用此