这里简单介绍一下如何注入事件,thinkphp 框架的钩子(行为)其实就是一个事件注册器,以 Auth.php 为例。可以将一些动作解耦出来,这里以 记住 的功能为例。
    首先封装一下 hook 的调用,app\common.php 文件, 封装一个 hook function

    1. if (!function_exists('hook')) {
    2. function hook($tag, $params) {
    3. return \think\facade\Hook::listen($tag, $params);
    4. }
    5. }

    因为该行为只是在 admin 模块下使用, 所以在 admin 模块下创建行为目录。注入钩子 - 图1
    如图建立一个 LoginRememberBehavior.php, 内容如下

    1. namespace app\admin\behavior;
    2. use think\facade\Cookie;
    3. class LoginRememberBehavior
    4. {
    5. public function run($params)
    6. {
    7. if ($params['remember_token']) {
    8. $params['user']->remember_token = $params['remember_token'];
    9. Cookie::forever('remember_token', $params['remember_token']);
    10. }
    11. $params['user']->login_at = date('Y-m-d h:i:s', time());
    12. $params['user']->login_ip = request()->ip();
    13. $params['user']->save();
    14. }
    15. }

    好了,钩子创建好之后还需要在 app\tags.php 注册。

    1. 'loginRemember' => app\admin\behavior\LoginRememberBehavior::class,

    注册完成之后就可以直接使用了,在 Auth 中使用,找到 loginRemember 方法。

    1. protected function loginRemember($user, Request $request)
    2. {
    3. $params['user'] = $user;
    4. $params['remember_token'] = null;
    5. if ($request->has('remember')) {
    6. $params['remember_token'] = $this->secretRememberToken($user->id, $this->generateRememberToken());
    7. }
    8. hook('loginRemember', $params);
    9. }

    这样就可以将 LoginRemember 功能独立出去了, 当然这里只是以其中一个功能为例。以后还可以扩展各种各样的行为,可以降低你项目功能之间耦合。以上就是建立钩子的以及使用的过程