加载中...

模型事件


模型事件

模型事件是指在进行模型的写入操作的时候触发的操作行为,包括模型的save方法和delete方法。

模型事件只在调用模型的方法生效,使用查询构造器操作是无效的

模型支持如下事件:

事件 描述 快捷方法
before_insert 新增前 beforeInsert
after_insert 新增后 afterInsert
before_update 更新前 beforeUpdate
after_update 更新后 afterUpdate
before_write 写入前 beforeWrite
after_write 写入后 afterWrite
before_delete 删除前 beforeDelete
after_delete 删除后 afterDelete
before_restore 恢复前(V5.1.13+ beforeRestore
after_restore 恢复后(V5.1.13+ afterRestore

使用方法如下:

  1. <?php
  2. namespace app\index\model;
  3. use think\Model;
  4. class User extends Model
  5. {
  6. public static function init()
  7. {
  8. self::event('before_insert', function ($user) {
  9. if (1 != $user->status) {
  10. return false;
  11. }
  12. });
  13. }
  14. }

注册的回调方法支持传入一个参数(当前的模型对象实例),但支持依赖注入的方式增加额外参数。

并且before_writebefore_insertbefore_updatebefore_delete事件方法如果返回false,则不会继续执行。

支持给一个位置注册多个回调方法,例如:

  1. User::event('before_insert', function ($user) {
  2. if ($user->status != 1) {
  3. return false;
  4. }
  5. });
  6. // 注册回调到beforeInsert函数
  7. User::event('before_insert', 'beforeInsert');

快捷注册

系统提供了内置的事件注册的快捷方法,你可以统一在init方法中进行模型事件定义:

  1. <?php
  2. namespace app\index\model;
  3. use think\Model;
  4. class User extends Model
  5. {
  6. protected static function init()
  7. {
  8. self::beforeInsert(function ($user) {
  9. if ($user->status != 1) {
  10. return false;
  11. }
  12. });
  13. }
  14. }

事件观察者

V5.1.13+版本开始,可以给模型注册一个事件观察者,例如:

  1. <?php
  2. namespace app\index\model;
  3. use think\Model;
  4. class User extends Model
  5. {
  6. protected $observerClass = 'app\index\event\User';
  7. }

或者在模型的init方法里面手动注册

  1. <?php
  2. namespace app\index\model;
  3. use think\Model;
  4. class User extends Model
  5. {
  6. protected static function init()
  7. {
  8. self::observe(app\index\event\User::class);
  9. }
  10. }

User观察者类定义如下:

  1. <?php
  2. namespace app\index\event;
  3. use app\index\model\Profile;
  4. class User
  5. {
  6. public function beforeUpdate($user)
  7. {
  8. if ('thinkphp' == $user->name) {
  9. return false;
  10. }
  11. }
  12. public function afterDelete($user)
  13. {
  14. Profile::destroy($user->id);
  15. }
  16. }

观察者类的方法就是事件对应的方法名称,方法的第一个参数就是模型对象实例,你依然可以通过依赖注入传入其它的对象参数。


还没有评论.