多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
事件 1\. 事件和中间件有一点相似,只不过事件更加的精准定位更细腻的业务场景; 2\. 事件可定义:事件类、事件监听类、事件订阅类; 3\. 我们先创建一个测试事件的类:TestEvent.php,手动创建一个测试类; ``` `public``function __construct()` `{` `//注册监听器` `Event::listen(``'TestListen'``, function ($param) {` `echo``'我是监听器,我被触发了!'``.$param;` `});` `}` `public``function info()` `{` `echo``'登录前准备!'``;` `Event::trigger(``'TestListen'``,``'ok'``);``//触发监听器` `event``(``'TestListen'``);``//助手函数触发` `}` ``` 4\. 我们也可以使用监听类来设计监听器,使用命令行创建; ``` `php think make:listener TestListen` `public``function info()` `{` `echo``'登录前准备!'``;` `Event::listen(``'TestListen'``, TestListen::``class``);``//这句可以定义到配置文件` `Event::trigger(``'TestListen'``);` `}` ``` 5\. 在 app/event.php 中,listen 是配置监听类的,配置方式如下: ``` `'listen'``=> [` `'TestListen'``=> [\app\listener\TestListen::``class``]` `],` ``` 6\. 而监听类被触发会自动执行 handle()方法,实现监听功能; ``` `public``function handle($``event``)` `{` `echo``'我是监听类!'``.$``event``;` `}` ``` 7\. 系统还内置了系统触发的事件,只要满足条件就会自动触发; ![](https://img.kancloud.cn/4f/db/4fdb708489da8ec1f3816df22dd9a8b1_684x281.png) 事件描述参数AppInit应用初始化标签位无HttpRun应用开始标签位无HttpEnd应用结束标签位当前响应对象实例LogWrite日志write方法标签位当前写入的日志信息RouteLoaded路由加载完成无 8\. 事件监听类,可以同时监听多个监听类,只要绑定到一个标识符即可; ``` `'TestListen'``=> [` `\app\listener\TestListen::``class``,` `\app\listener\TestOne::``class``,` `\app\listener\TestTwo::``class` `]` ``` 9\. 对于需要多个监听,监听类不够灵活,而且类会创建很多,可以使用订阅类; 10\. 订阅类就是将监听事件作为内部的方法用 on+方法名来实现; ``` `php think make:subscribe UserSub` `class``UserSub` `{` `public``function onUserLogin(){` `echo``'处理登录后的监听!'``;` `}` `public``function onUserLogout(){` `echo``'处理退出后的监听!'``;` `}` `}` ``` 11\. 然后,我们直接去 app/event.php 注册一下; ``` `'subscribe'``=> [` `'UserSub'``=> \app\subscribe\UserSub::``class``,` `],` ``` 12\. 然后,两个方法分别监听两个事件方法,直接调用方法名即可; ``` `public``function login(){` `echo``'登录成功!'``;` `Event::trigger(``'UserLogin'``);` `}` `public``function logout(){` `echo``'退出成功!'``;` `Event::trigger(``'UserLogout'``);` `}` ``` 13\. 对于事件类,很少有场景需要使用它,毕竟系统提供的各种精确方案较多; ``` `php think make:``event``UserEvent` `class``UserEvent` `{` `public``function __construct()` `{` `echo``'我是事件类!'``;` `}` `}` `Event::trigger(``new``UserEvent());` ``` 多应用模式 1\. 由于多应用模式属于扩展,我们需要额外安装; ``` composer require topthink/think-multi-app ``` 2\. 安装后,创建 index 和 admin 两个应用目录文件夹; 3\. 只要将 controller 和 model 移入即可,修改相应的命名空间; 4\. 将 view 也增加 index 和 admin 两个应用目录文件夹,移入相应文件夹; 5\. 默认的应用为 index,在 app.php 修改即可; ``` `// 默认应用` `'default_app'``=>``'index'``,` ``` 6\. 我们可以做应用映射,比如将 admin 目录映射为 think,admin 废弃; ``` `// 应用映射(自动多应用模式有效)` `'app_map'``=> [` `'think'``=>``'admin'` `],` ``` 7\. 我们也可以做域名绑定,比如,后台用域名绑定,直接访问; ``` `// 域名绑定(自动多应用模式有效)` `'domain_bind'``=> [` `'news.abc.com'``=>``'admin'``,` `'*'``=>``'index'` `],` ``` 8\. 路由修改:需要在应用目录单独建立路由,内部编码不需要更改;