设为首页 收藏本站
查看: 285|回复: 0

[经验分享] 模仿Laravel的事件管理器

[复制链接]

尚未签到

发表于 2017-3-21 09:23:19 | 显示全部楼层 |阅读模式
  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[0], count($segments) == 2 ? $segments[1] : '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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-352787-1-1.html 上篇帖子: [PHP开发必备] 下篇帖子: php 效率总结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表