我正试图将用户所做的所有操作(登录/注销/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系统