magdicom/hooks

一个轻量级的PHP动作钩子包。

资助包维护!
magdicom

v1.1.0 2022-01-12 08:03 UTC

README

Latest Version on Packagist Tests Total Downloads

受WordPress启发,动作钩子是你在代码的特定位置定义的函数,它通过将大代码块分割成单独的文件和/或类,帮助你保持代码的有序性。

安装

您可以通过composer安装此包

composer require magdicom/hooks

使用

快速入门

use Magdicom\Hooks;

$hooks = new Hooks();

# Register our functions
$hooks->register("Greetings", function($vars){
    return "Hi There,";
}, 1);

$hooks->register("Greetings", function($vars){
    return "This is the second line of greetings!";
}, 2);

# Later we run it
echo $hooks->all("Greetings")->toString("<br>");

上面的示例将输出

Hi There,
This is the second line of greetings!

输出

当你调用任何 allfirstlast 方法时,相应的钩子函数将被执行,它们的输出将被保存到特殊属性中,稍后可以使用 toStringtoArray 方法导出。

回调函数

闭包

$hooks->register("Callback", function($vars) {
    return "Closure";
});

函数名

function simple_function_name($vars){
    //
}

$hooks->register("Callback", "simple_function_name");

对象方法

class FooBar {
    public function methodName($vars){
        //
    }
}

$object = new FooBar;

$hooks->register("Callback", [$object, 'methodName']);

$hooks->register("Callback", [(new FooBar), 'methodName']);

静态方法

class FooBar {
    public static function staticMethodName($vars){
        //
    }
}

$hooks->register("Callback", ['FooBar', 'staticMethodName']);

如果这不是静态方法,将创建一个对象,并调用提供的方法。

参数

每次执行钩子回调函数时,可以传递一个参数数组给它,以帮助它执行所需的操作。

全局参数

可以使用 setParametersetParameters 方法定义全局参数,并且这些参数将在所有钩子点和回调函数中可用。

范围参数

全局参数的反义词,范围参数仅在指定的动作钩子点上可用,并且可以作为 allfirstlast 方法的第二个参数提供。

当您将其作为数组提供时,范围参数的值将临时替换(类似键条目)全局参数,并作为合并后的数组传递给 register 方法的回调。

当提供的参数是类对象时,它可以从 register 方法作为第一个参数访问,全局参数可以通过第二个参数访问。

class FooBarBaz {
    public $id;

    public function __construct(int $id){
        $this->id = $id;
    }
}

$hooks = new Hooks();

$hooks->setParameters([
    "name" => "Bar",
]);

$hooks->register("ParameterAsObject", function ($fooBarBaz, $params) {
    return [$fooBarBaz->id, $params['name']];
});

echo $hooks->all("ParameterAsObject", (new FooBarBaz(100))->toString("\n");

// Output will be
100
Bar

优先级

当您需要确保某些钩子函数应该按顺序执行时,这里就出现了 $priority,这是 register 方法的第三个和最后一个参数。

方法

__construct

$hooks = new Hooks(?array $parameters);

类构造方法可以可选地接受一个键值对数组。

register

$hooks->register(string $hookName, array|callable $callback, ?int $priority): self

通过此方法注册您所有的钩子函数

  • $hookName 这可以是您想要的任何东西,它就像一个分组名称,所有其他相关的动作钩子函数都将附加到它。
  • $callback 只接受 callable 函数。
  • $priority(可选)用于在执行之前对回调函数进行排序。

all

$hooks->all(string $hookName, array|object|null $parameters): self

将执行指定钩子名称的所有回调函数,默认情况下将返回输出字符串,有关更多选项,请检查输出部分。

  • $hookName 你想要执行的钩子名称。
  • $parameters 可选的键值对数组(或对象),你希望为同一钩子点的所有相关回调函数提供。

请注意:通过此方法提供的参数仅可在指定钩子点的范围内使用,要指定全局参数,请使用setParametersetParameters方法。

first

$hooks->first(string $hookName, array|object|null $parameters): self

除了仅执行排序后的第一个回调(之后)之外,在各个方面都与all方法类似。

last

$hooks->last(string $hookName, array|object|null $parameters): self

除了仅执行排序后的最后一个回调(之后)之外,在各个方面都与all方法类似。

toArray

$hooks->toArray(): array

将返回最后执行的钩子名称函数的输出数组。

toString

$hooks->toString(?string $separator): string

将返回最后执行的钩子名称函数的输出字符串。

  • $separator 可以用来按需分隔输出(例如:"\n","<br>")。

setParameter

$hooks->setParameter(string $name, mixed $value): self

使用此方法定义一个可以从任何钩子函数访问的参数。

  • $name 参数名称。
  • $value 参数值可以是字符串、数组甚至是对象。

备注:如果参数已经定义,则其旧值将被此处提供的值替换。

setParameters

$hooks->setParameters(array $parameters): self

setParameter相同,但此处它接受一个名称、值对数组作为其唯一参数。

setSourceFile

$hooks->setSourceFile(?string $path): self

debug方法一起使用。

debug

$hooks->debug(callable|null $callback): self

要启用调试功能,你需要通过提供一个回调函数来调用此方法,此函数应接受一个参数,该参数将是调试信息/消息。

$hooks->debug(function($message){
    // Will print debug message(s)
    echo $message . PHP_EOL;
});

$hooks->setSourceFile("/path/to/file/filename.php");

$hooks->register("Greetings", "FooBar::log");

$hooks->all("Greetings");

将输出

+ Added Source File: /path/to/file/filename.php
+ Hook Point: Greetings, New Callback Defined:
        -- Source: /path/to/file/filename.php
        -- Callback: FooBar::log
        -- Priority: 1
+ Hook Point: Greetings, Callback Functions Sorted!
+ Hook Point: Greetings, Output Generated For All Callback Functions!

测试

composer test

变更日志

有关最近更改的更多信息,请参阅变更日志

贡献

有关详细信息,请参阅贡献

致谢

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件