类中的动态方法定义

时间:2014-10-28 14:45:33

标签: php

我正在尝试创建一个使用挂钩触发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);
}

2 个答案:

答案 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_funccall_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) );
            }
        }

    }
    /* ... */
}