PHP 事件监听器最佳实践实现

2024-03-10

我正在尝试用 PHP 创建一个类似 CMS 的系统。使其尽可能模块化和可扩展。

有人可以为我提供在 PHP 中创建事件侦听器系统(例如 Drupal 系统的非常简化版本)的最佳实践方案,创建挂钩并在一个简短的示例中实现它们也很好。


嗯,从实现的角度来看,确实有三种不同的方法可以做到这一点(请注意,这些是面向对象的设计模式,但如果您愿意,您可以按功能或程序实现它们)。

1.观察者模式

您可以实施观察者模式 http://sourcemaking.com/design_patterns/observer。基本上,您可以将所有可以引发事件的事物作为主题。然后你想要监听的类/代码绑定到它想要专门监听的内容。假设你有一个名为Foo。如果你想听可以拨打电话$fooController->attach($observer);。然后,每当控制器想要说些什么时,它就会将事件分派给所有观察者。

这确实非常适合通知系统(以扩展类正在执行的操作)。它不太适合实时修改代码的行为。

2. 装饰器模式您还可以实施装饰模式 http://sourcemaking.com/design_patterns/decorator。基本上,您获取想要修改的对象,并将其“包装”在一个新对象中,该新对象可以执行您想要更改的操作。这非常适合修改和扩展行为(因为您可以有选择地覆盖包装类的功能)。

如果您已经定义了接口并希望对象符合它们,那么这种方法非常有效。如果您没有接口(或者没有正确使用它们),装饰器模式可以为您做的大部分事情都将丢失。

另请注意,这实际上不是一种执行事件的方法,而是一种修改对象行为的方法。

3. 中介者模式

您还可以使用Mediator http://sourcemaking.com/design_patterns/mediator。基本上,您将拥有一名全球调解员来跟踪您的听众。当您想要触发一个事件时,您可以将该事件发送给中介者。然后,中介器可以跟踪哪些侦听对象想要接收该事件,并正确地传递消息。

这样做的好处是处于中心位置。这意味着多个发送者可以发送相同的事件,对于监听者来说,谁发送的并没有什么区别......

我在一篇博客文章中详细阐述了这个主题。 http://blog.ircmaxell.com/2012/03/handling-plugins-in-php.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 事件监听器最佳实践实现 的相关文章

  • foreach 循环中 current() 的意外行为[重复]

    这个问题在这里已经有答案了 这是一个简单的循环 list array A B C D foreach list as var print current list Output demo http 3v4l org sBDjl BBBB O
  • 如何解决“无法加载PEM客户端证书,OpenSSL错误:02001003:系统库:fopen:没有这样的进程”错误?

    如果这个问题很愚蠢 请原谅 但我是这个领域的新手 我需要通过 SSL 从 Drupal 7 站点连接到服务 我有一个扩展名为 p12 的文件及其密码 另外 我使用 PHP 7 1 1 和 Windows 7 64x 我使用以下命令将 p12
  • ASCII“../”是 PHP 中指示目录遍历的唯一字节序列吗?

    我有一个 PHP 应用程序 它使用 GET参数来选择文件系统上的 JS CSS 文件 如果我拒绝输入字符串包含的所有请求 或者可见 7 位 ASCII 范围之外的字节 当路径传递到 PHP 的底层 基于 C 文件函数时 这是否足以防止父目录
  • 在 JQuery ui 自动完成中显示图像

    我有一个带有 JQuery ui 自动完成功能的脚本 可以完美运行 有一个显示用户名字和姓氏的搜索过程 但在我的数据库中 还有用户的图片 我想将其显示在带有名字和姓氏的建议中 数据库中pic包含图片url 剧本 function searc
  • jquery ajax加载后丢失CSS

    大家知道如何解决 load Ajax 请求后的 css 问题吗 例如 如果我想从网页加载 DIV 在我的 Ajax 请求之后 container load path to div div id 我丢失了与该 div 关联的所有 css 和脚
  • 使用 Apache 允许 Glassfish 和 PHP 在同一服务器中协同工作

    是否可以建立从 Java 到 php 文件的桥梁 我有一个用 Java 编写的应用程序 我需要执行http piwik org http piwik org 这是用 PHP 编写的 在服务器中 我正在运行 PHP 但无法从浏览器访问 php
  • 如何从 PHP 中的字符串创建可能的字符串组合?

    如何从 PHP 中的字符串创建可能的字符串组合 Exp input abc output array 0 gt a 1 gt ab 2 gt abc 3 gt ac 4 gt acb 5 gt b 6 gt ba 7 gt bac 8 gt
  • 将字符串分解为标记,保持引用的子字符串完整

    我不知道我在哪里看到它 但是谁能告诉我如何使用 php 和 regex 来完成这个任务 this is a string that has quoted text inside 我希望能够像这样爆炸它 0 this 1 is 2 a 3 s
  • node-mongodb-native的插入性能

    我正在使用 MongoDB 测试 Node js 的性能 我知道其中每一个都很好 彼此独立 但我正在尝试一些测试来感受它们 我遇到了这个问题 但无法确定来源 问题 我正在尝试在单个 Node js 程序中插入 1 000 000 条记录 它
  • 如何使用 PHP 查找字符串中字符的序列模式?

    假设我有随机的文本块 EAMoAAQAABwEBAAAAAAAAAAAAAAABAgMFBgcIBAkBAQABBQEBAAAAAAAAAAAAAAAGAgMEBQcBCBAAAQMDAgMEBQcIBQgGCwEAAQACAxEEBSEG
  • 是否可以在 PHP 中使用 file_get_contents 来破坏 CSRF 令牌验证

    在每个会话的表单上使用令牌的 CSRF 预防方法是一种流行的方法 但是 我不明白这种令牌方式如何保护file get contentsPHP 可以获取跨域文件表单的内容 gt 它可以获取表单上的令牌并使用它 那么这种token方式是如何运作
  • Composer 安装要求

    我正在尝试将 Composer 安装到 Laravel 项目中 当我做的时候sudo composer install在项目目录中它显示了两个错误 Problem 1 Installation request for simplesoftw
  • CakePHP - 选择性 SSL

    如何对网站的某些部分强制使用 HTTPS 例如登录页面或注册页面 并使用 HTTP 来完成网站的其余部分 我最喜欢的强制转换为 https 的方法是将其作为 php 脚本中的第一件事 它可以在 Joomla 中运行 也可以在 CakePHP
  • 使用 php 脚本的电子邮件管道

    你好 我想将所有电子邮件 到达我的收件箱 转发到 php 脚本并检索电子邮件内容并将其保存在文件中 因此 我正确地添加了具有管道路径的电子邮件转发器 转发地址 电子邮件受保护 cdn cgi l email protection 管道到程序
  • Laravel:使用 Faker 播种多个独特的列

    介绍 怎么样 伙计们 我有一个关于模型工厂和多个独特列的问题 背景 我有一个名为 Image 的模型 该模型将语言支持存储在单独的模型中 图片文字 图片文字 has an image id栏 语言栏和文本栏 图片文字有一个约束MySQL那个
  • php 邮件特殊字符 utf8

    我有以下脚本 在电子邮件中 主题 Testmail Special Characters Body Hi there this isn t somet
  • 将 PayPal 返回 URL 设置为 localhost

    我正在尝试集成 Paypal 并且在此过程中使用沙箱 我按照以下问题中接受的答案的步骤进行操作 设置 PayPal 返回 URL 并使其自动返回 https stackoverflow com questions 7642895 setti
  • PHPMailer 验证失败

    当我尝试在工作中使用 Windows Server 2012 上的 PHPMailer 来使用 SMTP 发送报告电子邮件时 出现身份验证失败错误 我在域上使用服务器管理员帐户 我非常确定密码是正确的 检查下面的代码 require PHP
  • 计算特定产品类别的购物车商品数量

    我试图仅从 WooCommerce 中的特定产品类别获取购物车中的商品数量 我正在为一家酒厂做一个网站 它有酒精和非酒精产品 所有葡萄酒都属于 葡萄酒 主类别或类别 ID 34 其下有许多子类别和产品 对于属于此类别的任何商品 我需要知道此
  • Monolog,如何将 PHP 数组记录到控制台?

    我正在使用浏览器处理程序将消息记录到 JS 控制台 require once vendor autoload php use Monolog Logger use Monolog Handler BrowserConsoleHandler

随机推荐

  • 为什么 gradle clean 任务会启动所有其他非默认任务?

    我已经设置并运行了 gradle 我的build gradle里面定义了 2 个任务 task setVersion println setVersion task setIntegrationEnv println setIntegrat
  • SignalR - 无法建立 SSL/TLS 安全通道的信任关系

    我正在尝试从服务器代码调用我的 signalR hub 方法 但它给了我一个错误 无法建立 SSL TLS 安全通道的信任关系 我的服务器端代码是这样的 private void InvokeNotification string meth
  • text() 和 string() 之间的区别

    有人可以解释一下 text 和 string 函数之间的区别吗 我经常将其与其他一起使用 但没有任何区别 两者都会获取xml节点的字符串值 有人可以解释一下text 和string 之间的区别吗 功能 I text 不是一个函数而是一个节点
  • Android 布局内的列表

    我正在开发一个 Android 应用程序 需要在布局 视图 内显示列表 表 我来自 iPhone dev objC land 我有一个应用程序 可以在视图 布局 内显示表格 列表 那么如何在我的布局中显示一个列表 并将其放置到指定位置 ce
  • 在 iPad 上滚动 iframe [重复]

    这个问题在这里已经有答案了 可能的重复 IFRAME 和 iPad 上的 Safari 用户如何滚动内容 https stackoverflow com questions 4599153 iframes and the safari on
  • 如何在 Swift 中压缩展开多个选项?

    我想解开这 6 个可选变量 如果它们为空 我想给它们一个空字符串值 这样我就可以将这些变量打包到发送到 API 的参数数组中 我仍然是 Swift 的初学者 这是我理解如何实现这一点的唯一最简单的方法 但我内心的编码员说这看起来很多余 而且
  • 错误:无法在此小部件上方找到正确的提供者< >

    我看不出我在下面做错了什么 但它抛出了一些提供程序错误和构建上下文 发生这种情况是因为您使用了BuildContext不包括提供者 你的选择 有以下几种常见场景 您在您的目录中添加了一个新的提供商main dart并执行热重载 要修复 请执
  • 如何清除 Eclipse Indigo 的缓存

    我想知道清除 Eclipse Indigo 缓存的标准方法是什么 您可以在启动 eclipse 时使用 clean 参数 例如 C eclipse eclipse exe vm C Program Files Java jdk1 6 0 2
  • 如何使用 Moles 通过 LINQ 从表中重定向选择?

    我有一个名为 订阅 的表 我想将该表中的任何 LINQ 选择重定向到 Moles lambda 以便从该表中只返回 3 行 基本上我想绕过对数据库的调用 到目前为止 我的代码如下所示 lazy loader is here to handl
  • 将现有的 C++(.h 和 .cpp)文件转换为 Android 的 java [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在 Eclipse 下为 Android 进行开发 我有一些 C h 和 cpp 文件希望在我的 A
  • Visual Studio 2015 发布 Web 仅具有自定义选项

    我正在使用 Visual Studio 2015 进行网络项目的网络发布 但似乎网络发布配置文件中的几个选项丢失了 此链接中应该包含选项使用 Visual Studio 2015 通过 Web 部署发布到 IIS http docs asp
  • 如何防止更改数组或对象的值

    我是 Java 初学者 在开发程序时 我使用构造函数创建了一个对象 并以变量作为参数 但是 当我在创建对象后更改变量的值时 我的对象具有第二个值而不是第一个值 我不希望我的对象改变值 我该怎么办 public class Person pu
  • Twitter Bootstrap - 全宽背景(图片)

    我目前正在进行一个项目 正在尝试很棒的 Twitter Bootstrap 包括响应式网格 除了一个问题之外 一切都运行良好 你如何给予 container 包含网格 背景颜色 例子 div class container green di
  • 每个请求上的 51Degrees 重新加载会减慢 ASP.NET MVC 的速度

    添加 51Degrees 移动检测库后 我的 ASP NET MVC 3 项目速度慢得像爬行一样 51Degrees 日志文件定义为
  • @Value 在单元测试中返回 null

    我有一个带有端点测试配置类和单元测试的 Spring Boot 应用程序来测试我的 http 客户端 我试图从位于我的 src test 中的 application properties 获取我的服务器地址和端口 所有类都在我的 src
  • 如何在action方法中获取匹配的token参数值?

    如果我的语法中有这样的内容 grammar G token tab indent Int level Using just level would require to have the same effect so use a code
  • Jquery 5秒后显示按钮[重复]

    这个问题在这里已经有答案了 所以我得到了这个按钮 我需要在 5 秒后显示它 我没有 jquery 或 javascript 经验 HTML 代码 p You need to wait 0 before you can proceed p
  • 有没有像 Reflector 这样的 COM 库工具?

    有没有像 Reflector 这样的 COM 库工具 我想打开一个 COM 库并浏览类和接口 就像在 Reflector 中一样 如果可能的话 我宁愿不安装 Visual Basic 6 0 来执行此操作 但方式不同 有许多工具可以让您检查
  • 在 Sqlalchemy 中导入 create_engine 时出现循环导入错误

    我正在尝试使用 Python 进行 CS50 Web 开发课程 在 sql 部分中 在从 sqlalchemy 导入 create engine 时出现此错误 ImportError 无法从部分初始化的模块 sqlalchemy 导入名称
  • PHP 事件监听器最佳实践实现

    我正在尝试用 PHP 创建一个类似 CMS 的系统 使其尽可能模块化和可扩展 有人可以为我提供在 PHP 中创建事件侦听器系统 例如 Drupal 系统的非常简化版本 的最佳实践方案 创建挂钩并在一个简短的示例中实现它们也很好 嗯 从实现的