hongyukeji/plugin

PHP 的插件系统,支持级联事件。

v1.5.1 2019-11-21 07:55 UTC

This package is auto-updated.

Last update: 2024-09-21 20:28:18 UTC


README

一个非常完整的插件系统,让您可以宣称您的应用程序支持插件!

为了使此功能正常工作,您需要 PHP 5.4。

Build Status Latest Stable Version Total Downloads License composer.lock

组件

php artisan vendor:publish --provider="Hongyukeji\Plugin\PluginServiceProvider"

组件

  • 钩子

    将它们放在您的代码中以执行事件。与几个其他包不同,这些钩子允许与数据交互,并且可以持有类的范围。

  • 事件

    当遇到具有相同键的钩子时,将发生事件。事件接受静态方法和闭包,以及优先级,因为 您可以堆叠它们并将变量传递给彼此

  • 结果

    钩子和事件共享的对象,并返回。它们使您的代码免于神秘的函数参数和更混乱的返回值。

  • 插件

    内部包处理器。 插件实际上是 Composer 包。 使用引导文件创建新事件和使用安装/卸载/升级钩子。

  • 加载器

    包实用工具。它检查您告诉它的文件夹,查找插件,加载它们并向您提供数组。

  • PlugSuit (特质)

    自动将插件添加到您的类中。它添加了前后钩子,并允许您覆盖传递给方法的参数。

您需要做什么?您必须使用 Loader 类创建您自己的管理面板并运行您选择的插件。由于它没有任何数据库绑定(或任何依赖关系),您必须自己创建启用/禁用系统。

以下是一些示例。

您可以通过以下页面深入了解这些说明

钩子和事件

包的最基本部分。您可以在代码的任何地方使用钩子和事件,而不仅仅是插件中。

<?php

use \Hongyukeji\Plugin\Hook as Hook;
use \Hongyukeji\Plugin\Event as Event;

// define an Event
Event::forge('triggerOnThis')->setCall(function($result){
	$result->set(123);
})->priority(2);

// the Hook triggers it
$result = Hook::forge('triggerOnThis')->execute();

// echoes 123
echo $result->get();

结果

我们编写了结果包以避免与级联事件混淆。这就是为什么事件只接受一个参数,我们用它来调用 $result

由于这里的大部分错误都发生在这一部分,任何未设置的参数或未设置的、没有明确回退的结果都会导致异常。

示例

<?php

// define an Event
Event::forge('triggerOnThis')->setCall(function($result){
	$increment = $result->getParam('increment')
	$increment++;
	$result->setParam($increment);
	$result->set($increment);
});

// define another Event editing the parameters with lower priority (lower number is higher priority, default is 5)
Event::forge('triggerOnThis')->setCall(function($result){
	$increment = $result->getParam('increment')
	$increment++;
	$result->set($increment);
})->priority(8);

// the Hook triggers it
$result = Hook::forge('triggerOnThis')
	->setParam('increment', 0)
	->execute();

// echoes 2 (we increased the number in each event)
echo $result->get();

// echoes 1 (we edited the parameter only in the first event)
echo $result->getParam('increment');

插件

我们有两个类来处理插件包:Plugin 和 Loader。

以下是如何加载您选择的要运行的插件的示例

<?php

$loader = Loader::forge()->setDir('main', '/path/to/plugins/');

$enabled_plugins = array('hongyukeji/fake', 'hongyukeji/kynet');

foreach ($loader->getPlugins('main') as $plugin)
{
	if (in_array($plugin->getConfig('name'), $enabled_plugins))
	{
		$plugin->execute();
	}
}

了解更多关于 插件 的信息。