当前位置:   article > 正文

ThinkPHP6 事件使用_tp6 事件

tp6 事件

先吐槽下:TP简直就是个半成品,参考手册真的是只能用于参考,搞不清楚的时候还是直接看源码吧。


事件的本质就是用于代码解耦,简单的理解可以认为是在代码里加的钩子函数。使用起来可以分成两种情况,使用事件类和不使用事件类,推荐使用事件类。

使用步骤

使用事件类的步骤:

  1. 定义事件类,在event.php中添加事件类的绑定。(事件类可以认为是用于传递变量的介质)
  2. 定义事件监听类,在event.php中添加事件监听。(绑定和监听的键名建议相同,推荐使用事件的类名[不带命名空间])
  3. 在需要触发事件的位置,使用trigger()方法触发事件。

不使用事件类的步骤:

官方手册说可以不定义事件类,仅使用监听就行。这个说法经测试是可行的,因为监听处理方法的第一个参数(仅有一个参数)不指定类型的情况,可以传任意对象(变量)。

  1. 定义监听类,在event.php中添加事件监听。(没有绑定事件,所以键名就没要求了)
  2. 在需要触发事件的位置,使用trigger('键名'[, 参数(仅支持一个,要传多个参数就给个数组)])方法触发事件。

示例代码

使用事件类的方式

1. 使用命令新建事件类文件:(手动建也没问题)

php think make:event TestEvent

会生成文件:app\event\TestEvent.php

2. 打开文件并修改:

  1. <?php
  2. declare(strict_types=1);
  3. namespace app\event;
  4. class TestEvent
  5. {
  6. private $id = 0;
  7. public function __construct($id)
  8. {
  9. $this->id = $id;
  10. }
  11. public function getId()
  12. {
  13. return $this->id;
  14. }
  15. }

3. 添加事件绑定,修改文件:app\event.php。(建议事件都写在文件里,不要用动态绑定)

  1. <?php
  2. // 事件定义文件
  3. return [
  4. 'bind' => [
  5. 'TestEvent' => 'app\event\TestEvent'
  6. ],
  7. .................
  8. ];

4. 使用命令新建监听处理类,类文件:app\listener\TestEventListener.php

  1. <?php
  2. declare(strict_types=1);
  3. namespace app\listener;
  4. use app\event\TestEvent;
  5. class TestEventListener
  6. {
  7. /**
  8. * 事件监听处理
  9. *
  10. * @param TestEvent $event 这里指定参数为定义好的事件类,触发时必须使用这个类的实例触发
  11. * @return mixed
  12. */
  13. public function handle(TestEvent $event)
  14. {
  15. echo 'TestEvent 事件监听处理 TestEvent Id: ' . $event->getId();
  16. }
  17. }

5. 注册监听,修改文件:app\event.php

  1. <?php
  2. // 事件定义文件
  3. return [
  4. 'bind' => [
  5. 'TestEvent' => 'app\event\TestEvent',
  6. ],
  7. 'listen' => [
  8. 'TestEvent' => ['app\listener\TestEventListener'],
  9. 'AppInit' => [],
  10. 'HttpRun' => [],
  11. 'HttpEnd' => [],
  12. 'LogLevel' => [],
  13. 'LogWrite' => [],
  14. ],
  15. ...........................
  16. ];

6. 控制器或其它地方触发事件:

  1. <?php
  2. declare(strict_types=1);
  3. namespace app\test\controller;
  4. use app\BaseController;
  5. use app\event\TestEvent;
  6. use think\facade\Event;
  7. class EventTest extends BaseController
  8. {
  9. /**
  10. * 事件测试
  11. *
  12. * @return void
  13. */
  14. public function eventTest()
  15. {
  16. /**
  17. * 使用事件类实例触发
  18. * 这种情况要求:绑定和监听的键名必须相同,而且键名必须是事件的类名(不带命名空间)
  19. */
  20. Event::trigger(new TestEvent(12));
  21. /**
  22. * 使用绑定事件的键名触发绑定的事件,监听的键名与绑定事件的键名不同时可用于触发指定的监听
  23. *
  24. * 如:app\evnet.php中的设置为:
  25. *
  26. * <?php
  27. * // 事件定义文件
  28. * return [
  29. *
  30. * 'bind' => [
  31. * 'TestEvent' => 'app\event\TestEvent',
  32. * ],
  33. *
  34. * 'listen' => [
  35. * 'TestEvent1' => ['app\listener\TestEventListener'],
  36. * ..................
  37. * ],
  38. * ...................
  39. * ];
  40. */
  41. Event::trigger('TestEvent1', new TestEvent(13)); // 调用不存在的监听键,没代码被执行
  42. }
  43. }

不使用事件类的方式

1. 定义监听类

  1. <?php
  2. declare (strict_types = 1);
  3. namespace app\listener;
  4. class UserLoginListener
  5. {
  6. /**
  7. * 事件监听处理
  8. *
  9. * @return mixed
  10. */
  11. public function handle($event)
  12. {
  13. //
  14. echo 'UserLoginListener. <br>';
  15. print_r($event); // 参数为触发时传过来的变量(任意类型)
  16. echo '<br>';
  17. }
  18. }

2. 注册监听

  1. 'listen' => [
  2. 'UserLoginEvent' => ['app\listener\UserLoginListener'],
  3. ...................
  4. ],

3. 触发事件

  1. public function eventListenerTest()
  2. {
  3. Event::trigger('UserLoginEvent'[, 参数]); // 参数可以任意类型
  4. }

结尾:还有一种方式是事件订阅的方式,感觉这种方式对于解耦并不友好,所以就不写了。如果有需要可以看下(参考)参考手册。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/351384
推荐阅读
  

闽ICP备14008679号