什么是事件
怎么去理解事件呢,通俗一点来讲,好比你去淘宝网买东西,下了一个订单,下订单之后会触发和订单相关的一些事情,比如系统会将订单信息推入队列、通知卖家备货,这就是一系列的事情集合。
引用上述下订单的例子,一般按照传统的开发流程,实现上述功能,应该这样写(伪代码):
class OrderController
{
public function actionCreateOrder()
{
// 1.创建订单
$orderModel = new Order();
$orderModel->create($order_id,$buyer_id);
OrderModel::create();
// 2.推入队列
$orderQueue = new OrderQueue();
$orderQueue->push($queue_name,$order_id);
// 3.短信通知商家
$msg = new Msg();
$msg->send($seller_id,$content);
}
}
这种写法在功能实现上是没有问题,但是有一个弊端就是,代码耦合在一起,假如现在产品规划,要在下单之后,给买家发送一封邮件,那是不是就要在这段代码里新添加代码逻辑:
public function actionCreateOrder()
{
// 1.创建订单
$orderModel = new Order();
$orderModel->create($order_id,$buyer_id);
OrderModel::create();
// 2.推入队列
$orderQueue = new OrderQueue();
$orderQueue->push($queue_name,$order_id);
// 3.短信通知商家
$msg = new Msg();
$msg->send($seller_id,$content);
// 4.邮件通知买家
$mail = new Mail();
$mail->send($buyer_id,$content);
}
如果后期又要对下订单进行功能扩充和修改,那么就要频繁的去修改这段代码,时间长了,这段代码会越来越长,越来越臃肿,越来越难维护。分析其中原因,就是从功能上说,下单和下单之后的一系列事件,诸如发短信,发邮件,其实是松耦合的关系,但是在actionCreateOrder()方里,把这几个功能捆绑的死死的,丝毫分不开,这就是一种糟糕的设计。所以,这里我们要引入事件,事件在这里就是为了解耦,让代码逻辑变的松散,和易于维护。
动手实现一个我们自己的事件类
先来简单实现一个我们自己的事件类:
class Event
{
protected $_events = [];
public function on($name, $handler, $append = true)
{
//这里用$append来干涉同一个事件下的handler执行顺序
if ($append || empty($this->_events[$name])) {
$this->_events[$name][] = [$handler];
} else {
//如果$append为false,则会优先执行该事件下的这个handler
//即将这个handler放入该事件数组的第一位
array_unshift($this->_events[$name], [$handler]);
}
}
public function trigger($name)
{
if (!empty($this->_events[$name])) {
foreach ($this->_events[$name] as $handlerBox) {
call_user_func($handlerBox[0]);
}
}
}
}
class TestEvent extends Event
{
public function run()
{
$this->on("EVENT_1", [