24cun_cn 发表于 2017-3-21 09:23:19

模仿Laravel的事件管理器

  Laravel事件提供了简单的观察者模式实现,允许你订阅和监听应用中的事件。
  配置文件

<?php
use Event\Event;
Event::listen('ON_TEST', [
'Event\Listeners\Test', function($msg){
echo $msg.':函数方式';
echo "<br />";
},
'Event\Listeners\Test@add'
]);

//综合单废除以后
Event::listen('wws_abolished', ['\Event\Listeners\PaintOrderListener@abolish']);
  事件服务类

<?php
/**
* 一个简单的事件服务
*/
namespace Event;

class Event
{
protected $listen;
protected static $instance = null;
private function __construct() {
}
public static function getInstance() {
if (empty(static::$instance)) {
static::$instance = new self();
}
return static::$instance;
}
protected function parseClassCallable($listener) {
$segments = explode('@', $listener);
return [$segments, count($segments) == 2 ? $segments : 'handle'];
}
public function createClassListener($listener) {
list($class, $method) = $this->parseClassCallable($listener);
return function () use ($class, $method) {
return call_user_func_array(
[$class, $method], func_get_args()
);
};
}
//事件配置文件
public static function boot($config) {
include_once($config);
}
public function hasListen($event) {
return isset($this->listen[$event]);
}
public static function once($event, $callback) {
$self = static::getInstance();
if (!$self->hasListen($event)) {
static::listen($event, $callback);
}
}
//注册监听器
public static function listen($event, $callback) {
if (!is_array($callback)) {
$callback = [$callback];
}
$self = static::getInstance();
foreach ($callback as $item) {
if (is_callable($item)) {
$self->listen[$event][] = $item;
}
if (is_string($item)) {
$self->listen[$event][] = $self->createClassListener($item);
}
}
}
//要触发一个事件,可以使用Event门面,传递一个事件实例到fire方法,fire方法会分发事件到所有监听器
public static function fire() {
$args = func_get_args();
$event = array_shift($args);
$args[] = $event;
$self = static::getInstance();
foreach ($self->listen[$event] as $callback) {
if (is_callable($callback)) {
$result = call_user_func_array($callback, $args);
if (false === $result) { //如果事件处理报错则终止向下传递
return false;
}
}
}
}
}
  处理小例子

<?php
namespace Event\Listeners;
class Test
{
public function handle($msg)
{
echo $msg.':不指定方法';
echo '<br/>';
}
public function add($msg)
{
echo $msg.":指定方法";
echo "<br />";
}
}
  调用事件

//ON_TEST:不指定方法
//ON_TEST:函数方式
//ON_TEST:指定方法
Event::boot(CONF_PATH.'event.php');
Event::fire('ON_TEST');
页: [1]
查看完整版本: 模仿Laravel的事件管理器