使用必要
开闭原则——对扩展开放,对修改关闭。这是代码组织当中的一条非常重要的原则。
场景
在商城系统中,存在着很多中支付方式,最终都是实现订单付款的”操作”。
如果订单操作都是集中在一个地方处理,那么几种支付方式仅仅需要 “通知” 即可。
event绑定
在 event 的场景中,其实使用和设计event都比较简单,难的是如何设计 event 合理的绑定时机。
目前参考 thinkphp 在程序加载的时候绑定为全局事件,这样在程序任何需要触发的地方都可以触发。
利用 引导组件(例子是basic版)
程序在一开始初始化的时候就加载的组件: https://www.yiichina.com/doc/guide/2.0/structure-extensions#bootstrapping-classes
<?php
namespace 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
<?php
namespace app\base;
abstract class BaseHandler
{
public abstract function register ();
}
OrderPayHandler
<?php
namespace 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
<?php
namespace 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'
]));