
在最新的6.0版本中引入了新的事宜体系用以替换5.1版本的行动,同时也接管了数据库事宜和模子事宜。
本篇重要形貌下新版的事宜体系以及查询事宜、模子事宜的运用。
定义事宜
事宜体系的一切操纵都经由过程think\facade\Event类举行静态挪用
事宜体系运用了观察者形式,供应相识耦运用的更好体式格局。在你须要监听事宜的位置,增添以下代码:
Event::trigger('UserLogin');
或许运用助手函数
event('UserLogin');
这里UserLogin示意一个事宜标识,假如你定义了零丁的事宜类,你能够运用事宜类名,以至能够传入一个事宜类实例。
event('app\event\UserLogin');
事宜类能够经由过程命令行疾速生成
php think make:event UserLogin
默许会生成一个app\event\UserLogin事宜类,也能够指定完全类名生成。
我们能够给事宜类增添要领
namespace app\event; use app\model\User; class UserLogin { public $user; public function __construct(User $user) { $this->user = $user; } }
平常事宜类无需继承任何别的类。
你能够给事宜类绑定一个事宜标识
Event::bind('UserLogin', 'app\event\UserLogin');
或许在运用的event.php事宜定义文件中批量绑定。
return [ 'bind' => [ 'UserLogin' => 'app\event\UserLogin', // 更多事宜绑定 ], ];
假如你没有定义事宜类的话,则无需绑定。
ThinkPHP的事宜体系不依靠事宜类,假如没有分外的需求,仅经由过程事宜标识也能够运用。
你能够在event要领中传入一个事宜参数
event('UserLogin', $user);
事宜监听
你能够手动注册一个事宜监听
Event::listen('UserLogin', function($user) { // });
或许运用监听类
Event::listen('UserLogin', 'app\listener\UserLogin');
能够经由过程命令行疾速生成一个事宜监听类
php think make:listener UserLogin
默许会生成一个app\listener\UserLogin事宜监听类,也能够指定完全类名生成。
事宜监听类只须要定义一个handler要领,支撑依靠注入。
<?php namespace app\listener; class UserLogin { public function handle($user) { // 事宜监听处置惩罚 } }
在handler要领中假如返回了false,则示意监听中断,将不再实行该事宜背面的监听。
平常发起直接在事宜定义文件中定义对应事宜的监听。
return [ 'bind' => [ 'UserLogin' => 'app\event\UserLogin', // 更多事宜绑定 ], 'listen' => [ 'UserLogin' => ['\app\listener\UserLogin'], // 更多事宜监听 ], ];
事宜定阅
能够经由过程事宜定阅机制,在一个监听器中监听多个事宜,比方经由过程命令行生成一个事宜定阅者类,
php think make:subscribe User
默许会生成app\subscribe\User类,或许你能够指定完全类名生成。
然后你能够在事宜定阅类中增添差别事宜的监听要领,比方:
<?php namespace app\subscribe; class User { public function onUserLogin($user) { // 事宜相应处置惩罚 } public function onUserLogout($user) { // 事宜相应处置惩罚 } }
监听事宜的要领定名范例是on+事宜标识(驼峰定名),然后注册该事宜定阅
Event::subscribe('app\subscribe\User');
平常发起直接在事宜定义文件中定义
return [ 'bind' => [ 'UserLogin' => 'app\event\UserLogin', // 更多事宜绑定 ], 'listen' => [ 'UserLogin' => ['\app\listener\UserLogin'], // 更多事宜监听 ], 'subscribe' => [ '\app\subscribe\User', // 更多事宜定阅 ], ];
内置事宜
内置的体系事宜包含:
AppInit事宜定义必须在全局事宜定义文件中定义,别的事宜支撑在运用的事宜定义文件中定义。
本来5.1的一些行动标签已烧毁,一切作废的标签都能够运用中间件更好的替换。能够把中间件算作处置惩罚要求以及相应输出相干的特别事宜。事实上,中间件的handle要领只是具有特别的参数以及返回值罢了。
查询事宜
数据库操纵的回调也称为查询事宜,是针对数据库的CURD操纵而设想的回调要领,重要包含:
运用下面的要领注册数据库查询事宜
\think\facade\Db::event('before_select', function ($query) { // 事宜处置惩罚 return $result; });
同一个查询事宜能够注册多个相应实行。查询事宜在新版内里也已被事宜体系接管了,因而假如你注册了一个before_select查询事宜监听,底层实际上是向标识为db.before_select的事宜注册了一个监听。
查询事宜的要领参数只要一个:当前的查询对象。但你能够经由过程依靠注入的体式格局增添分外的参数。
模子事宜
模子事宜是指在举行模子的查询和写入操纵的时刻触发的操纵行动。
模子事宜只在挪用模子的要领见效,运用查询组织器操纵是无效的。
模子支撑以下事宜:
注册的回调要领支撑传入一个参数(当前的模子对象实例),但支撑依靠注入的体式格局增添分外参数。
假如before_write、before_insert、 before_update 、before_delete事宜要领中返回false或许抛出think\exception\
ModelEventException非常的话,则不会继承实行后续的操纵。
模子事宜定义
最简朴的体式格局是在模子类内里定义静态要领来定义模子的相干事宜相应。
<?php namespace app\index\model; use think\Model; use app\index\model\Profile; class User extends Model { public static function onBeforeUpdate($user) { if ('thinkphp' == $user->name) { return false; } } public static function onAfterDelete($user) { Profile::destroy($user->id); } }
参数是当前的模子对象实例,支撑运用依靠注入传入更多的参数。
模子事宜观察者
假如愿望模子的事宜零丁治理,能够给模子注册一个事宜观察者,比方:
<?php namespace app\index\model; use think\Model; class User extends Model { protected $observerClass = 'app\index\observer\User'; }
User观察者类定义以下:
<?php namespace app\index\observer; use app\index\model\Profile; class User { public function onBeforeUpdate($user) { if ('thinkphp' == $user->name) { return false; } } public function onAfterDelete($user) { Profile::destroy($user->id); } }
观察者类的事宜相应要领的第一个参数就是模子对象实例,你依旧能够经由过程依靠注入传入别的的对象参数。
ki4网,大批的免费ThinkPHP入门教程,迎接在线进修!
本文转自:https://blog.thinkki4.cn/1037387
以上就是ThinkPHP6.0:事宜体系以及查询事宜、模子事宜的运用的细致内容,更多请关注ki4网别的相干文章!