我正在开发一个包含事件和插件的插件类,用于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
有没有办法获取给定方法的内容,并将其传递给匿名函数以将二者构建为一个,或者我应该反映它?
使这项工作最好的技巧是什么?
答案 0 :(得分:0)
对于任何感兴趣的人,我使用了一个闭包来将回调作为参数传递给现有方法。
$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_args()
时会产生:
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)
非常感谢任何想法。