這里簡單介紹一下如何注入事件,thinkphp 框架的鉤子(行為)其實就是一個事件注冊器,以 Auth.php 為例。可以將一些動作解耦出來,這里以 **記住** 的功能為例。
首先封裝一下 **hook** 的調用,app\common.php 文件, 封裝一個 hook function
```
if (!function_exists('hook')) {
function hook($tag, $params) {
return \think\facade\Hook::listen($tag, $params);
}
}
```
因為該行為只是在 **admin** 模塊下使用, 所以在 admin 模塊下創建行為目錄。
如圖建立一個 **LoginRememberBehavior.php**, 內容如下
```php
namespace app\admin\behavior;
use think\facade\Cookie;
class LoginRememberBehavior
{
public function run($params)
{
if ($params['remember_token']) {
$params['user']->remember_token = $params['remember_token'];
Cookie::forever('remember_token', $params['remember_token']);
}
$params['user']->login_at = date('Y-m-d h:i:s', time());
$params['user']->login_ip = request()->ip();
$params['user']->save();
}
}
```
好了,鉤子創建好之后還需要在 app\tags.php 注冊。
```
'loginRemember' => app\admin\behavior\LoginRememberBehavior::class,
```
注冊完成之后就可以直接使用了,在 Auth 中使用,找到 **loginRemember** 方法。
```
protected function loginRemember($user, Request $request)
{
$params['user'] = $user;
$params['remember_token'] = null;
if ($request->has('remember')) {
$params['remember_token'] = $this->secretRememberToken($user->id, $this->generateRememberToken());
}
hook('loginRemember', $params);
}
```
這樣就可以將 **LoginRemember** 功能獨立出去了, 當然這里只是以其中一個功能為例。以后還可以擴展各種各樣的行為,可以降低你項目功能之間耦合。以上就是建立鉤子的以及使用的過程