54 lines
1.3 KiB
PHP
54 lines
1.3 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace App\Core;
|
||
|
|
||
|
class HookDispatcher
|
||
|
{
|
||
|
/**
|
||
|
* Stores all registered hooks and their callbacks.
|
||
|
* @var array<string, array<callable>>
|
||
|
*/
|
||
|
private static array $hooks = [];
|
||
|
|
||
|
/**
|
||
|
* Register a callback for a given hook.
|
||
|
*/
|
||
|
public static function register(string $hook, callable $callback): void
|
||
|
{
|
||
|
if (!isset(self::$hooks[$hook])) {
|
||
|
self::$hooks[$hook] = [];
|
||
|
}
|
||
|
self::$hooks[$hook][] = $callback;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Dispatch all callbacks for the specified hook.
|
||
|
*/
|
||
|
public static function dispatch(string $hook, array $context = []): void
|
||
|
{
|
||
|
if (!empty(self::$hooks[$hook])) {
|
||
|
foreach (self::$hooks[$hook] as $callback) {
|
||
|
call_user_func($callback, $context);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Apply filters for a hook key, passing a value through all callbacks.
|
||
|
* Each callback should accept the value and return a modified value.
|
||
|
*
|
||
|
* @param string $hook
|
||
|
* @param mixed $value
|
||
|
* @return mixed
|
||
|
*/
|
||
|
public static function applyFilters(string $hook, $value)
|
||
|
{
|
||
|
if (!empty(self::$hooks[$hook])) {
|
||
|
foreach (self::$hooks[$hook] as $callback) {
|
||
|
$value = call_user_func($callback, $value);
|
||
|
}
|
||
|
}
|
||
|
return $value;
|
||
|
}
|
||
|
}
|