【发布时间】:2014-10-28 14:45:33
【问题描述】:
我正在尝试创建一个 PrestaShop 模块,该模块使用钩子触发 POST 请求。
钩子是这样调用的:
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);
}
【问题讨论】:
-
检查这个:php.net/manual/en/language.oop5.overloading.php#object.call 并查看
__call()方法。 -
如果所有
hook<restOfTheName>方法都存在,您可以使用method_exists($instance, 'hook'.$hookName)或is_callable。您也可以使用__call来捕获对不存在的方法的调用,但这不是一个很好的解决方案 -
这些方法不存在,我基本上想调用一个方法来在调用其中一个方法时触发一个 POST 请求,从而创建一个 webhook。
-
@BenFortune:为什么不创建一个
doHook方法,将钩子名称作为参数传递给它,在该doHook方法中使用switch并处理每个钩子名称因此?为什么要实现一个缓慢且容易出错的__call方法? -
@EliasVanOotegem 我无法控制方法名称,它们是硬编码到 PrestaShop 中的预定义挂钩。我使用
$this->registerHook('actionValidateOrder')激活钩子并使用public function hookactionValidateOrder(){}在我的模块中创建一个方法。doHook永远不会被调用。
标签: php