`
hudeyong926
  • 浏览: 2028268 次
  • 来自: 武汉
社区版块
存档分类
最新评论

模仿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[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');

 

分享到:
评论

相关推荐

    Laravel开发-elasticsearch-model

    这个扩展包通常被称为“Eloquent for Elasticsearch”,因为它模仿了Laravel的Eloquent ORM(对象关系映射)的语法和工作方式,使得操作Elasticsearch就像操作数据库中的表一样简单。 **Elasticsearch简介** ...

    Laravel开发-facades

    服务容器是Laravel的核心部分,负责管理类的依赖关系和实例化。Facades只是服务容器的一个便利接口,它们使得开发者无需直接与服务容器交互,也能轻松地注入依赖和解耦代码。 在学习`Laravel开发-facades`时,你将...

    Laravel开发-arty

    虽然arty可能不提供完整的Laravel种子功能,但你可以模仿Laravel的种子机制来创建和运行种子文件。 6. **自定义命令**:arty允许开发者根据需求扩展命令,这意味着你可以添加自己的命令来完成特定任务,比如数据...

    Laravel开发-laravel-modules

    Laravel Modules旨在模仿类似Yii2或Symfony的bundle或module概念,为开发者提供了一种优雅的方式来创建可复用、可配置的模块化组件。 ## 1. 模块化开发的优势 1. **代码组织**:通过模块化,可以将复杂的应用程序...

    IocContainer:模仿laravel设计的ioc容器

    在laravel框架中,IoC容器被广泛使用,用于管理服务和其依赖。通过定义服务绑定和解析,开发者可以方便地进行依赖注入,使得组件之间松耦合,降低了代码的复杂度。 在laravel的IoC容器中,你可以注册服务提供者...

    Laravel开发-rubywebsite

    这通常包括安装Composer(PHP的依赖管理器),创建一个新的Laravel项目,以及配置服务器环境变量如数据库连接等。 4. **Laravel的目录结构** "rubywebsite-master"可能是项目的根目录,包含所有源代码。Laravel的...

    JavaScript中的简单轻量级和可定制的Laravel模型

    为了将这种体验带入前端,一些开发者创建了轻量级的JavaScript库,模仿Laravel的模型(Model)概念,使得前端数据管理更加方便。这个压缩包文件"lorisleiva-javel-5ec91aa"可能就是一个这样的实现,名为"Laravel for...

    Laravel开发-sophia

    1. `composer.json` - Laravel项目的依赖管理文件,列出了项目所需的所有PHP库及其版本。 2. `server.php`/`public/index.php` - Laravel的启动脚本,负责引导请求到框架的核心部分。 3. `app/` - 包含应用的自定义...

    Laravel-code:Laravel源码分析

    **Laravel 源码分析** Laravel 是一个广受欢迎的 PHP ...通过分析 `Laravel-code-master` 压缩包中的源码,开发者可以更深入地了解这些概念,甚至模仿 Laravel 设计自己的框架,从而增强对 PHP 开发的理解和实践能力。

    Laravel开发-honeycomb-resources

    这个CMS可能专注于提供一种结构化的、模块化的资源管理方式,模仿蜂窝的六边形结构,使得数据组织更加有序且高效。下面将详细介绍与Laravel开发和资源管理相关的知识点。 1. **Laravel框架**:Laravel是PHP的一个...

    Laravel开发-themes

    在Laravel框架中,开发"Themes"是一种组织和管理应用前端样式、布局及视图的有效方式。这使得我们可以轻松地切换或扩展应用的外观,同时保持后端代码的整洁和独立。下面将详细介绍Laravel中如何进行主题开发,以及...

    核心:AdminArchitect-Laravel的活动管理员

    "缺少Laravel管理框架" 表明在Laravel社区中,可能缺乏一个广泛接受和使用的官方管理界面,而AdminArchitect正是为填补这一空白而创建的,它提供了类似ActiveAdmin的体验,ActiveAdmin是Rails开发中的一个流行管理...

    Laravel开发-oc-blog .zip

    1. **Laravel 框架基础**:理解路由、控制器、视图、模型、数据库迁移、Eloquent ORM 等核心概念。 2. **Blade 模板引擎**:学习如何使用 Blade 语法创建模板,实现动态内容渲染。 3. **数据库设计**:涉及用户表、...

    Laravel开发-htmldom

    接下来,可以将`simple_html_dom`类引入到控制器或其他需要的地方,以便在Laravel的环境中使用。 4. **实例化与解析HTML**:通过`file_get_html()`函数,可以加载一个HTML字符串或文件,将其转化为`simple_...

    laravel-atlas:这是Laravel Nova的主题,目的是使Laravel Nova看起来更像Wordpress和Statamic。 目前仍在制品

    **Statamic** 则是一个现代化的静态站点生成器,同样提供了强大的内容管理功能,以简洁的 Markdown 编辑和灵活的结构而受到开发者喜爱。 在 **laravel-atlas** 的开发过程中,开发者可能关注以下几个方面: 1. **...

    基于laravel+reactjs实现的面向中小企业的、开源免费的、类Jira的问题需求跟踪工具

    标题中的“基于laravel+reactjs实现的面向中小企业的、开源免费的、类Jira的问题需求跟踪工具”表明,这是一个采用现代Web开发技术构建的软件系统,专为中小企业设计,模仿了知名的项目管理工具Jira的功能,并且是...

    laravel-airbnb:使用Laravel的简单AirBnb克隆

    【标题】:“laravel-airbnb:使用Laravel的简单AirBnb克隆”是指一个基于Laravel框架开发的Web应用程序项目,旨在模仿知名的在线住宿预订平台AirBnb的功能和用户体验。这个项目为开发者提供了一个实践Laravel框架...

    学生成绩管理系统项目案例源代码

    学生成绩管理系统是一种常见的软件应用,它主要用于教育机构或教师管理学生的学术成绩、个人信息和出勤情况等。这个项目案例提供了完整的源代码,是初学者踏入编程世界,特别是IT行业中数据库管理和Web应用开发的...

    Laravel validate error处理,ajax,json示例

    首先,Laravel内置了一个非常实用的验证器Validator,它允许开发者以非常直观的方式对请求数据进行验证。在实际应用中,开发者可以调用`Validator::make()`方法来创建一个验证器实例。该方法接收两个参数,第一个...

    模仿简书的php期末课设.zip

    通过这个项目,学生将深入理解Laravel框架的基本概念,如路由配置、控制器设计、视图模板、Eloquent ORM(对象关系映射)以及Blade模板引擎。他们还将学习如何使用Composer管理依赖,使用Git进行版本控制,以及如何...

Global site tag (gtag.js) - Google Analytics