使用必要

参考连接:https://www.cnblogs.com/minirice/p/yii2_event.html

开闭原则——对扩展开放,对修改关闭。这是代码组织当中的一条非常重要的原则。

场景

在商城系统中,存在着很多中支付方式,最终都是实现订单付款的”操作”。
如果订单操作都是集中在一个地方处理,那么几种支付方式仅仅需要 “通知” 即可。

event绑定

在 event 的场景中,其实使用和设计event都比较简单,难的是如何设计 event 合理的绑定时机。
目前参考 thinkphp 在程序加载的时候绑定为全局事件,这样在程序任何需要触发的地方都可以触发。

利用 引导组件(例子是basic版)

程序在一开始初始化的时候就加载的组件: https://www.yiichina.com/doc/guide/2.0/structure-extensions#bootstrapping-classes

  1. <?php
  2. namespace app\service\loader;
  3. use yii\base\BootstrapInterface;
  4. use app\service\handlers\OrderPayHandler;
  5. class HandlerLoader implements BootstrapInterface
  6. {
  7. public function bootstrap ($app)
  8. {
  9. $this->load();
  10. }
  11. public function load ()
  12. {
  13. /**
  14. *
  15. * @var array \app\base\BaseHandler $handlers
  16. */
  17. $handlers = [
  18. OrderPayHandler::class
  19. ];
  20. foreach($handlers as $handleClass)
  21. {
  22. $handler = new $handleClass();
  23. if(! empty($handler))
  24. {
  25. $handler->register();
  26. }
  27. }
  28. }
  29. }

配置

  1. <?php
  2. $params = require __DIR__ . '/params.php';
  3. $db = require __DIR__ . '/db.php';
  4. $config = [
  5. 'id' => 'basic',
  6. 'basePath' => dirname(__DIR__),
  7. 'bootstrap' => [
  8. 'log',
  9. 'queue',
  10. // 配置loader
  11. 'app\service\loader\HandlerLoader'
  12. ],
  13. ];
  14. return $config;

模拟订单支付

BaseHandler

  1. <?php
  2. namespace app\base;
  3. abstract class BaseHandler
  4. {
  5. public abstract function register ();
  6. }

OrderPayHandler

  1. <?php
  2. namespace app\service\handlers;
  3. use app\base\BaseHandler;
  4. use app\service\events\OrderPayEvent;
  5. use Yii;
  6. class OrderPayHandler extends BaseHandler
  7. {
  8. const ORDER_PAY = 'event_order_pay';
  9. public function register ()
  10. {
  11. Yii::$app->on(self::ORDER_PAY, function (OrderPayEvent $event)
  12. {
  13. echo $event->order_sn . '被支付';
  14. });
  15. }
  16. }

OrderPayEvent

  1. <?php
  2. namespace app\service\events;
  3. use yii\base\Event;
  4. class OrderPayEvent extends Event
  5. {
  6. public $order_sn;
  7. }

触发订单支付成功

  1. <?php
  2. \Yii::$app->trigger(OrderPayHandler::ORDER_PAY, new OrderPayEvent([
  3. 'order_sn' => '202001010101'
  4. ]));