Php 如何将两种方法结合在一起

Php 如何将两种方法结合在一起,php,methods,hook,Php,Methods,Hook,我正在开发一个插件类,它包含MVC PHP应用程序的事件和挂钩 正如想象的那样,事件被设计为在状态改变时被调用,主要是在模型中,因为这是数据改变的地方,有一些事件被分散到控制器中,以及用于登录、注销等 我希望钩子在整个应用程序中的大部分方法都可用,但也会有一些例外 我已经构建了钩子的存储和注册,然后将它们推送到我的注册表类,这样它们就可以在应用程序范围内使用 挂钩的存放方式如下: Array ( [admin_controller] => Array // type of hook

我正在开发一个插件类,它包含MVC PHP应用程序的事件和挂钩

正如想象的那样,事件被设计为在状态改变时被调用,主要是在模型中,因为这是数据改变的地方,有一些事件被分散到控制器中,以及用于登录、注销等

我希望钩子在整个应用程序中的大部分方法都可用,但也会有一些例外

我已经构建了钩子的存储和注册,然后将它们推送到我的注册表类,这样它们就可以在应用程序范围内使用

挂钩的存放方式如下:

Array
 (
  [admin_controller] => Array // type of hook
   (
     [0] => Array
      (
        [class] => \Admin\Controller\Tool\Test // class to hook
        [method] => index // method to hook
        [callback] => /Plugin/Test/Hooks/Controller/exampleHook // callback to run
        [arguments] => Array  // any arguments required
          (
            [heading_title] => Example Test Page
            [item_title] => Item title
           )
       )
    )
)
但现在我不知道如何将这两种方法结合起来。我不希望钩子覆盖原始方法,只需添加到它

我也不想在1700文件应用程序的每个方法中都去听它:p

有没有一种方法可以获取给定方法的内容,并将其传递给一个匿名函数以将二者构建为一,或者我应该反映它


使这项工作正常的最佳技术是什么?

对于任何感兴趣的人,我使用闭包将回调作为参数传递给现有方法

$callable = false;
$hook_key = str_replace('\\', '', strtolower($prefix)) . '_controller';

if (array_key_exists($hook_key, $hooks)):
    foreach($hooks[$hook_key] as $hook):
        if ($hook['class'] === $class && $hook['method'] === $this->method):

            $mthd = basename($hook['callback']);
            $cls  = rtrim(str_replace($mthd, '', $hook['callback']), '/');

            $callback = array(
                'class'  => str_replace('/', '\\', $cls),
                'method' => $mthd,
                'args'   => $hook['arguments']
            );

            $callable = function () use ($callback) {
                $hook = new $callback['class'];
                if (is_callable(array($hook, $callback['method']))):
                    return call_user_func_array(array($hook, $callback['method']), $callback['args']);
                endif;
            };

        endif;

        if ($callable):
            $this->args[] = $callable();
        endif;
    endforeach;
endif;
剩下的唯一问题是钩子参数数组在执行时丢失了它的键

在回调上转储func_get_参数时,它会生成:

array (size=2)
  0 => string 'Example Test Page' (length=17)
  1 => string 'Item title' (length=10)
如果我将'args'=>$hook['arguments']包装在数组'args'=>array$hook['arguments']中,则键将被保留,但数组是嵌套的

array (size=1)
  0 => 
    array (size=2)
      'heading_title' => string 'Example Test Page' (length=17)
      'item_title' => string 'Item title' (length=10)
任何想法都将不胜感激