处理 Laravel 5 默认事件

2015/04/17

Laravel 提供了很多默认事件,登录登出、数据库连接与查询、应用启动前后、缓存等等很多默认事件,本篇以用户登录事件来演示如何处理 Larvel 5 的默认事件。

我们的目的:处理用户登录事件,在用户登录的时候给用户添加最后登录时间(last_login_at),以及最后登录的IP(last_ip)

用户的登录事件在 Laravel 5 里的事件名称是 auth.login

第一步:创建事件处理器

Laravel 5 里直接使用命令即可创建一个事件处理器:

php artisan handler:event AuthLoginEventHandler

AuthLoginEventHandler 是我们定义的名称,你可以随意命名(合理的),它会创建 app/Handlers/Events/AuthLoginEventHandler.php:

<?php namespace App\Handlers\Events;

use Illuminate\Contracts\Queue\ShouldBeQueued;
use Illuminate\Queue\InteractsWithQueue;

class AuthLoginEventHandler {

    /**
     * Create the event handler.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  Events  $event
     * @return void
     */
    public function handle(Event $event)
    {
        //
    }
}

第二步:注册监听

打开 app/Providers/EventServiceProvider.php,将我们的监听添加上:

protected $listen = [
    'auth.login' => [
        'App\Handlers\Events\AuthLoginEventHandler',
    ],
];

第三步:添加逻辑代码

我们的需求是:在用户登录的时候给用户添加最后登录时间(last_login_at),以及最后登录的IP(last_ip)。 > 注意:这两个字段是我自己创建的 当然,这里只是举例,你可以在这里完成所有你想要的需求。

注意:框架默认的事件触发时的参数都可能不同,具体请查看框架源码或者参阅相关文档。 小窍门:使用 关键字 fire(' 在框架目录中搜索,可以得到大部分的框架事件的调用处。

这里 auth.login 事件框架会传递两个参数:用户实例, 是否记住登录,所以我们修改我们刚刚创建的 AuthLoginEventHandler.php 中的 handle 方法:

    /**
     * 处理用户登录
     *
     * @param User    $user     用户
     * @param boolean $remember 是否记住登录
     *
     * @return void
     */
    public function handle(User $user, $remember)
    {
        $user->last_login_at = Carbon::now();
        $user->last_ip = $this->request->ip();

        //TODO:其它动作,比如增加积分等等。

        $user->save();
    }

可以看到上面我们用到了 Illuminate\Http\Request 对象,所以我们还需要添加一个属性 protected $request,然后从构造方法 __construct 让框架注入进来(由框架完成注入):

    ...

    /**
     * Request 对象
     *
     * @var Illuminate\Http\Request
     */
    protected $request;

    /**
     * Create the event handler.
     *
     * @return void
     */
    public function __construct(Request $request)
    {
        $this->request = $request;
    }

    ...

我们所有用到的类请记得引入。最后完整的 AuthLoginEventHandler.php 如下:

<?php namespace App\Handlers\Events;

use Illuminate\Contracts\Queue\ShouldBeQueued;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Http\Request;
use App\Models\User;
use Carbon\Carbon;

class AuthLoginEventHandler {

    /**
     * Request 对象
     *
     * @var Illuminate\Http\Request
     */
    protected $request;

    /**
     * Create the event handler.
     *
     * @return void
     */
    public function __construct(Request $request)
    {
        $this->request = $request;
    }

    /**
     * 处理用户登录
     *
     * @param User    $user     用户
     * @param boolean $remember 是否记住登录
     *
     * @return void
     */
    public function handle(User $user, $remember)
    {
        $user->last_login_at = Carbon::now();
        $user->last_ip = $this->request->ip();

        //TODO:其它动作,比如增加积分等等。

        $user->save();
    }
}

然后在用户登录的时候就会自动给用户字段 last_login_atlast_ip 补充内容了。是不是很方便呢?