我正在尝试创建一个使用挂钩触发POST请求的PrestaShop模块。
钩子被调用如下:
if(is_callable(array($moduleInstance, 'hook'.$hook_name)) {
$moduleInstance->{'hook'.$hook_name}($hook_args);
}
捕获钩子事件的意义我需要在类中提供方法。所以说我想调用一个名为myCustomEvent
的钩子,我需要以下内容:
class myModule extends Module {
public function hookmyCustomEvent($params) {
}
}
但是,我想要做的是在数据库中存储一个钩子事件列表,并在调用钩子时触发它们。但要做到这一点,我需要在类中定义的方法。我希望能够做的是拥有一种"魔法" /通配符方法,从hook
开始捕获它们。
这可能吗?
编辑:
方法不存在,因为我基本上希望动态调用它们,执行另一种方法。
示例的真实代码:
public function hookactionValidateOrder($params) {
$this->fireWebhook('actionValidateOrder', $params);
}
public function hookactionOrderStatusUpdate($params) {
$this->fireWebhook('actionOrderStatusUpdate', $params);
}
public function hookactionUpdateQuantity($params) {
$this->fireWebhook('actionUpdateQuantity', $params);
}
private function fireWebhook($event, $data) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, Configuration::get('HOOK_URL'));
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'event' => $event,
'data' => $data
]));
curl_exec($ch);
curl_close($ch);
}
答案 0 :(得分:1)
public function __call($methodName, array $params) {
if (substr($methodName, 0, 4) === 'hook') {
// this matches something starting with "hook" so pull your instructions from the db here
}
}
这样的东西会匹配一个方法,而不需要将它明确地定义为类方法,我认为是你的意图吗?
答案 1 :(得分:0)
要使用call_user_func或call_user_func_array
对动态定义执行方法调用call_user_func( array($moduleInstance, 'hook'.$hook_name) , $hook_args );
至于您执行以hook
开头的所有方法的请求我建议如下:
class MyModule
{
/* ... */
public function executeHooks()
{
$methods = get_class_methods($this);
foreach ($methods as $method) {
if (substr($method, 0, 4) == 'hook') {
// Method is a hook
call_user_func( array($this, $method) );
}
}
}
/* ... */
}