Files
nexusphp/nexus/Plugin/Hook.php

85 lines
2.9 KiB
PHP
Raw Normal View History

2022-06-03 03:42:53 +08:00
<?php
namespace Nexus\Plugin;
class Hook
{
private static array $callbacks = [];
public function addFilter($name, $function, $priority, $argc)
{
$id = $this->buildUniqueId($function);
self::$callbacks[$name][$priority][$id] = ['function' => $function, 'argc' => $argc];
}
private function buildUniqueId($function): string
{
if (is_string($function)) {
return $function;
} elseif (is_object($function) && ($function instanceof \Closure)) {
//Closure
return spl_object_hash($function);
} elseif (is_array($function)) {
if (is_object($function[0])) {
return spl_object_hash($function[0]).$function[1];
} elseif (is_string($function[0])) {
return $function[0].'::'.$function[1];
}
}
throw new \InvalidArgumentException("Invalid function, type: " . gettype($function));
}
public function applyFilter($name, $value = '')
{
if (!isset(self::$callbacks[$name])) {
2022-08-22 21:07:06 +08:00
do_log("No this hook: $name", 'debug');
2022-06-08 14:15:59 +08:00
return $value;
2022-06-03 03:42:53 +08:00
}
$args = func_get_args();
ksort(self::$callbacks[$name]);
2022-06-03 03:42:53 +08:00
reset(self::$callbacks[$name]);
2022-08-20 19:11:28 +08:00
// do_log("name: $name, argc: " . (func_num_args() - 1));
2022-06-03 03:42:53 +08:00
do {
foreach ((array)current(self::$callbacks[$name]) as $id => $callback) {
2022-06-03 03:42:53 +08:00
$args[1] = $value;
// do_log("name: $name, id: $id, before, params: " . nexus_json_encode(array_slice($args, 1, $callback['argc'])));
2022-06-03 03:42:53 +08:00
$value = call_user_func_array($callback['function'], array_slice($args, 1, $callback['argc']));
// do_log("name: $name, id: $id, after, value: " . nexus_json_encode($value));
2022-06-03 03:42:53 +08:00
}
}
while (next(self::$callbacks[$name]) !== false);
return $value;
}
public function addAction($name, $function, $priority, $argc)
{
return $this->addFilter($name, $function, $priority, $argc);
}
2022-06-10 06:34:32 +08:00
public function doAction($name, $value = '')
2022-06-03 03:42:53 +08:00
{
2022-06-10 06:34:32 +08:00
if (!isset(self::$callbacks[$name])) {
2022-08-22 21:07:06 +08:00
do_log("No this hook: $name", 'debug');
2022-06-10 06:34:32 +08:00
return;
}
$args = func_get_args();
ksort(self::$callbacks[$name]);
2022-06-10 06:34:32 +08:00
reset(self::$callbacks[$name]);
2022-08-20 19:11:28 +08:00
// do_log("name: $name, argc: " . (func_num_args() - 1));
2022-06-10 06:34:32 +08:00
do {
foreach ((array)current(self::$callbacks[$name]) as $id => $callback) {
// do_log("name: $name, id: $id, before, params: " . nexus_json_encode(array_slice($args, 1, $callback['argc'])));
2022-06-10 06:34:32 +08:00
call_user_func_array($callback['function'], array_slice($args, 1, $callback['argc']));
}
}
while (next(self::$callbacks[$name]) !== false);
2022-06-03 03:42:53 +08:00
}
public function dump()
{
echo '<pre>';
var_dump(self::$callbacks);
echo '</pre>';
}
}