ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## **一、省略事件类的demo** >[info] 确定触发事件的地方,这里为index控制器index方法 ``` <?php namespace app\admin\controller; use app\BaseController; use think\facade\View; use think\facade\Event; class Index extends BaseController { public function index() { echo "开始位置<br>"; //直接使用事件类触发 Event::trigger('UserLogin'); echo "<br>结束位置<br>"; } } ``` >[info] 定义model类 ``` <?php namespace app\admin\model; use think\Model; //class User extends Model 模拟数据不希望tp操作数据库所以不要继承model class User { //获取用户ID为1的用户信息 public function getUserInfo() { //模拟用户数据 $user=new \stdClass(); $user->id=2; $user->name="tom"; $user->age=18; $user->login_count=0; return $user; } } ``` >[info] 绑定事件、注册监听(admin/event.php定义) >app/admin/event.php ``` <?php // 事件定义文件 return [ 'bind' => [ //绑定事件类 'UserLogin' => '\app\admin\event\UserLogin', ], 'listen' => [ //注册监听 'UserLogin' => ['\app\admin\listener\UserLogin'], ], 'subscribe' => [ ], ]; ``` >[info] 定义事件类 > app/admin/event/UserLogin.php ``` <?php namespace app\admin\event; use app\admin\model\User as UserModel; class UserLogin { public $user; public function __construct(UserModel $user) { $this->user = $user; } //给用户登录次数+1 public function setLoginCount() { $userInfo = $this->user->getUserInfo(); $userInfo->login_count += 1; return $userInfo; } } ``` >[info] 定义监听类 >app/admin/listener/UserLogin.php ``` <?php namespace app\admin\listener; use app\admin\event\UserLogin as UserLoginEvent; class UserLogin { /** * 必须实现handle * @param \app\event\UserLogin $userLoginEvent 自定义的事件类 * @return void */ public function handle(UserLoginEvent $userLoginEvent) { $user=$userLoginEvent->user; $userinfo=$user->getUserInfo(); $userinfo->active=true; var_dump($userinfo); echo '<br>'; var_dump($userLoginEvent->setLoginCount()); } } ``` >浏览器输出结果 ``` 开始位置 object(stdClass)#41 (5) { \["id"\]=> int(2) \["name"\]=> string(3) "tom" \["age"\]=> int(18) \["login\_count"\]=> int(0) \["active"\]=> bool(true) } object(stdClass)#40 (4) { \["id"\]=> int(2) \["name"\]=> string(3) "tom" \["age"\]=> int(18) \["login\_count"\]=> int(1) } 结束位置 ``` >完结撒花 ## **二、动态监听demo** >[info] 确定触发事件的地方,这里为index控制器index方法 ``` <?php namespace app\admin\controller; use app\BaseController; use think\facade\View; use think\facade\Event; class Index extends BaseController { public function index() { echo "开始位置<br>"; //动态绑定 这个不绑定也可以,明明有事件类的呀不知什么情况 Event::bind(['UserLogin' => 'app\admin\event\UserLogin']); //手动注册监听 Event::listen('UserLogin', 'app\admin\listener\UserLogin'); //直接使用事件类触发 Event::trigger('UserLogin'); echo "<br>结束位置<br>"; } } ``` >[info] 定义model类 ``` <?php namespace app\admin\model; use think\Model; //class User extends Model 模拟数据不希望tp操作数据库所以不要继承model class User { //获取用户ID为1的用户信息 public function getUserInfo() { //模拟用户数据 $user=new \stdClass(); $user->id=2; $user->name="tom"; $user->age=18; $user->login_count=0; return $user; } } ``` >[info] 定义事件类 > app/admin/event/UserLogin.php ``` <?php namespace app\admin\event; use app\admin\model\User as UserModel; class UserLogin { public $user; public function __construct(UserModel $user) { $this->user = $user; } //给用户登录次数+1 public function setLoginCount() { $userInfo = $this->user->getUserInfo(); $userInfo->login_count += 1; return $userInfo; } } ``` >[info] 定义监听类 >app/admin/listener/UserLogin.php ``` <?php namespace app\admin\listener; use app\admin\event\UserLogin as UserLoginEvent; class UserLogin { /** * 必须实现handle * @param \app\event\UserLogin $userLoginEvent 自定义的事件类 * @return void */ public function handle(UserLoginEvent $userLoginEvent) { $user=$userLoginEvent->user; $userinfo=$user->getUserInfo(); $userinfo->active=true; var_dump($userinfo); echo '<br>'; var_dump($userLoginEvent->setLoginCount()); } } ``` >浏览器输出结果同上