【问题标题】:php Plugin Architecturephp 插件架构
【发布时间】:2014-12-17 04:42:19
【问题描述】:

我只是在玩弄 php 来创建插件架构。 为此,我正在使用事件侦听器(调解器)模式,其中代码可以侦听/触发事件。

我真正的问题是如何使侦听器对象在整个应用程序中可用。' 我现在能想到的唯一解决方案是让核心监听器/观察器类单点,这样任何地方的任何代码都可以注册一个监听器。

$listener = Plugin::getInstance();
$listener->addEventListener('savePost', ....);

对于触发,我也可以使用相同的过程。

例如,仅将注册的事件数组设为静态

private static $registeredEvents = array();
public function addEventListener($eventName, Closure $c){         
     self::$registeredEvents[$eventName] = $c;
}

如果我这样做,无论插件/侦听器对象如何提供给任何客户端代码 将使用相同的容器 ( $registeredEvents )

否则,向其他对象提供侦听器类的新实例会导致注册事件分散。因此,当从系统触发特定事件时,我无法遍历来自不同实例的每个注册事件。

所以请任何人向我展示更有效的方法。

【问题讨论】:

    标签: php plugins singleton mediator


    【解决方案1】:

    单例类和静态 $registeredEvents 是一个很好的方法 您没有加载内存,因为您只使用静态实例和仅分配一个的静态注册事件。

    在 PHP 中,当您使用对象时,实际上是在使用这些对象的指针

    您还可以使用注册表(例如 Zend_Registry)并在注册表中保留唯一的实例

    示例:

    $registry = Zend_Registry::getInstance();
    $registry->set('listener', $listener); // or
    // $registry->listener = $listener;
    

    对于加载,您将使用:

    // $registry = Zend_Registry::getInstance(); // if needed
    $registry->listener->addEventListener();
    

    你也可以把函数设为静态,甚至不需要实例化,你只需要:

    My_Listener_Class::addEventListener();
    

    有关更多想法,请考虑检查此问题:

    http://stackoverflow.com/questions/42/best-way-to-allow-plugins-for-a-php-application
    

    它可能会帮助你。它包含一些在 php 中集成插件的好方法。

    【讨论】:

    • 虽然回复晚了。谢谢(你的)信息。我一定会研究 zend 注册表。
    猜你喜欢
    • 2011-01-19
    • 2023-04-03
    • 2014-04-28
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    相关资源
    最近更新 更多