我知道有自动插入的字段(例如 updated_at 和 created_at )但我想知道是否有类似Eloquent方法 timestamp()或Laravel生成时间戳的方法?
例如,我想每次用户登录系统时记录时间戳并将其存储到数据库中,这样我们就可以看到每个用户的上次登录日期和时间细节。
答案 0 :(得分:69)
在Laravel 5.2+(也在5.6上测试)过程略有不同。首先,将您的监听器添加到EventServiceProvider:
protected $listen = [
'Illuminate\Auth\Events\Login' => [
'App\Listeners\LogSuccessfulLogin',
],
];
然后做:
php artisan event:generate
这将在app / Listeners中创建一个新的监听器。现在编辑您的监听器以触摸users表中last_login列中的日期:
public function handle(Login $event)
{
$event->user->last_login = date('Y-m-d H:i:s');
$event->user->save();
}
确保Artisan创建的监听器在顶部具有正确的命名空间。对于这种特殊情况,监听器中的正确名称空间应为:
use Illuminate\Auth\Events\Login;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
答案 1 :(得分:28)
您可能会观察auth.login
事件并更新用户的上次登录时间。请参阅documentation中的第一个示例,了解事件的确切内容。
Event::listen('auth.login', function($user) {
$user->last_login = new DateTime;
$user->save();
});
注意:在4.0中,事件名称为user.login
。在4.1中,事件名称为auth.login
这取决于你放置事件监听器的位置。如果您阅读链接到doc页面,它会声明:
所以,你知道如何注册事件,但你可能想知道在哪里 注册他们。别担心,这是一个常见的问题。不幸, 这是一个很难回答的问题,因为你可以注册一个活动 差不多到了!但是,这里有一些提示。再次,像大多数其他 引导代码,您可以在其中一个启动文件中注册事件 例如app / start / global.php。
如果你的起始文件过于拥挤,你可以创建一个 单独的app / events.php文件包含在起始文件中。这个 是一个简单的解决方案,可以保持您的事件注册干净 与其余的引导分开。如果你喜欢上课 基于方法,您可以在服务提供商中注册您的活动。 由于这些方法中没有一个本质上是“正确的”,所以选择一个 根据你的大小,让你觉得舒服 应用
我个人的偏好是在服务提供商中注册它们,因为这样可以使它们隔离,对我来说就是更“Laravel”的做事方式。如果您需要有关服务提供商的帮助,请参阅this文档条目。
但是,如果您真的只想尽快获得并运行,那么在app/start/global.php
答案 2 :(得分:12)
我有一个类似的问题。如果您觉得不需要使用事件,则可以在对用户进行身份验证后更新时间戳。我将以下代码放在我的处理用户身份验证的控制器方法中。
if (Auth::attempt(array('email'=>$email, 'password'=>$password))) {
Auth::user()->last_login = new DateTime();
Auth::user()->save();
return Redirect::intended('/');
} else {
return Redirect::to('account/login');
}
这对我有用。
答案 3 :(得分:10)
只需将以下代码添加到App \ Http \ Controllers \ Auth \ LoginController.php
中在控制器的顶部:
use Carbon\Carbon;
use Illuminate\Http\Request;
在控制器内部放置此功能:
public function authenticated(Request $request, $user) {
$user->last_login = Carbon::now()->toDateTimeString();
$user->save();
}