使用必要
开闭原则——对扩展开放,对修改关闭。这是代码组织当中的一条非常重要的原则。
场景
在商城系统中,存在着很多中支付方式,最终都是实现订单付款的”操作”。
如果订单操作都是集中在一个地方处理,那么几种支付方式仅仅需要 “通知” 即可。
event绑定
在 event 的场景中,其实使用和设计event都比较简单,难的是如何设计 event 合理的绑定时机。
目前参考 thinkphp 在程序加载的时候绑定为全局事件,这样在程序任何需要触发的地方都可以触发。
利用 引导组件(例子是basic版)
程序在一开始初始化的时候就加载的组件: https://www.yiichina.com/doc/guide/2.0/structure-extensions#bootstrapping-classes
<?phpnamespace app\service\loader;use yii\base\BootstrapInterface;use app\service\handlers\OrderPayHandler;class HandlerLoader implements BootstrapInterface{public function bootstrap ($app){$this->load();}public function load (){/**** @var array \app\base\BaseHandler $handlers*/$handlers = [OrderPayHandler::class];foreach($handlers as $handleClass){$handler = new $handleClass();if(! empty($handler)){$handler->register();}}}}
配置
<?php$params = require __DIR__ . '/params.php';$db = require __DIR__ . '/db.php';$config = ['id' => 'basic','basePath' => dirname(__DIR__),'bootstrap' => ['log','queue',// 配置loader'app\service\loader\HandlerLoader'],];return $config;
模拟订单支付
BaseHandler
<?phpnamespace app\base;abstract class BaseHandler{public abstract function register ();}
OrderPayHandler
<?phpnamespace app\service\handlers;use app\base\BaseHandler;use app\service\events\OrderPayEvent;use Yii;class OrderPayHandler extends BaseHandler{const ORDER_PAY = 'event_order_pay';public function register (){Yii::$app->on(self::ORDER_PAY, function (OrderPayEvent $event){echo $event->order_sn . '被支付';});}}
OrderPayEvent
<?phpnamespace app\service\events;use yii\base\Event;class OrderPayEvent extends Event{public $order_sn;}
触发订单支付成功
<?php\Yii::$app->trigger(OrderPayHandler::ORDER_PAY, new OrderPayEvent(['order_sn' => '202001010101']));
