zumba/symbiosis

Symbiosis,用于引导插件的事件结构。

v3.0.2 2020-10-21 21:04 UTC

This package is auto-updated.

Last update: 2024-09-22 05:07:32 UTC


README

Symbiosis 是一个即插即用的事件驱动插件架构。

目标是允许任何人通过面向事件系统为现有的代码库创建插件结构。使用 Symbiosis 的次要好处是事件结构可以独立于插件结构使用。

Latest Stable Version Build Status

要求

PHP 7.2

设置

  1. 将其作为 composer 依赖项添加,或直接从 composer 安装。
  2. 就是这样!

测试

  1. 运行 composer install --dev
  2. 运行 ./vendor/bin/phpunit

示例插件使用

插件

<?php

namespace \YourApp\Plugin;

use \Zumba\Symbiosis\Framework\Plugin,
    \Zumba\Symbiosis\Event\EventManager,
    \Zumba\Symbiosis\Framework\Registerable;

class SamplePlugin extends Plugin implements Registerable
{
  public function getEvents()
  {
    return [
      'sample.someevent' => function($event) {
        print_r($event->data());
      });
    ];
  }

}

您的应用程序引导

<?php

use \Zumba\Symbiosis\Plugin\PluginManager;

// Somewhere in your application bootstrap, load your plugins
$pluginManager = new PluginManager(
  '/path/to/your/plugin/directory', // Path to where you stored your plugins
  'YourApp\Plugin'                  // namespace defined in your plugins (see example above)
);
$pluginManager->loadPlugins();

您的应用程序

<?php

use \Zumba\Symbiosis\Event\Event;

// Somewhere in your app, trigger plugins listening to event
$pluginManager->trigger(new Event('sample.someevent', ['ping' => 'pong']));

输出

Array
(
    [ping] => pong
)

单独的事件注册表

v1.2 版本开始,已添加事件注册表以允许事件分离。这允许对事件注册表进行“命名空间化”。由于 EventManager 保持向后兼容,现在 EventManager 创建了一个静态的 EventRegistry 实例。由于事件结构在插件架构中松散耦合,这允许您按插件对事件注册表进行命名空间化。

示例事件注册表命名空间化

<?php

$registry1 = new \Zumba\Symbiosis\Event\EventRegistry();
$registry2 = new \Zumba\Symbiosis\Event\EventRegistry();

$registry1->register('sample.someevent', function ($event) {
	print_r($event->data());
});
$registry2->register('sample.someevent', function ($event) {
	echo "Separate registry\n";
	print_r($event->data());
});

$event = new \Zumba\Symbiosis\Event\Event('sample.someevent', array('ping' => 'pong'));
$registry1->dispatch($event);
// Prints:
// Array(
//   [ping] => pong
// )

$registry2->dispatch($event);
// Prints:
// Separate registry
// Array(
//   [ping] => pong
// )

PSR-14 支持

此库与 PSR-14 兼容。

一个需要注意的问题是,EventRegistry 需要注册实现了 \Zumba\Symbiosis\Framework\EventInterface 的事件,这包括实现了 \Psr\EventDispatcher\StoppableEventInterface

EventRegistry 实现

  • \Psr\EventDispatcher\ListenerProviderInterface
  • \Psr\EventDispatcher\EventDispatcherInterface

Event 实现

  • \Psr\EventDispatcher\StoppableEventInterface

有关更多详细信息,请参阅 PSR-14 事件调度器文档