在 class C 中委派模块 M 的挂钩处理程序不起作用:未触发此处理程序
Delegating the hook handler of a module M in a class C doesn't work: this handler is not triggered
考虑这个 Prestashop 1.7 模块 M:
class M extends Module
{
public function __construct()
{
$this->c = new Negoce\Classes\C($this);
}
}
如您所见,我将它的实例给了一个 class C
。后者的代码是:
class C {
public function __construct($mod) {
$mod->registerHook('actionObjectCustomerAddAfter');
}
public function hookActionObjectCustomerAddAfter($data) {
$client = $data['object'];
echo '<pre>';
echo ' $client ';
var_dump($client);
echo '</pre>';
exit;
}
}
预期的行为是:如果我在 Prestashop 中创建一个客户,然后执行转储 exit
,导致出现包含转储文本的空白页。
实际行为是:如果我在 Prestashop 中创建客户,则不会执行转储,exit
也不会,导致客户列表页面显示新创建的客户和通知告诉我新客户已创建。
可以通过不使用 class C
并在 class M
中移动后者的代码来获得预期的行为。但是,出于易用性和可维护性的目的,我真的想委托给 C
。
我该怎么做?为什么它不起作用?
这是我认为更好的方法:
class M extends C
class C extends Module
提示:您的 "registerHook" 函数不应位于构造函数中。它必须在安装函数中。
考虑这个 Prestashop 1.7 模块 M:
class M extends Module
{
public function __construct()
{
$this->c = new Negoce\Classes\C($this);
}
}
如您所见,我将它的实例给了一个 class C
。后者的代码是:
class C {
public function __construct($mod) {
$mod->registerHook('actionObjectCustomerAddAfter');
}
public function hookActionObjectCustomerAddAfter($data) {
$client = $data['object'];
echo '<pre>';
echo ' $client ';
var_dump($client);
echo '</pre>';
exit;
}
}
预期的行为是:如果我在 Prestashop 中创建一个客户,然后执行转储 exit
,导致出现包含转储文本的空白页。
实际行为是:如果我在 Prestashop 中创建客户,则不会执行转储,exit
也不会,导致客户列表页面显示新创建的客户和通知告诉我新客户已创建。
可以通过不使用 class C
并在 class M
中移动后者的代码来获得预期的行为。但是,出于易用性和可维护性的目的,我真的想委托给 C
。
我该怎么做?为什么它不起作用?
这是我认为更好的方法:
class M extends C
class C extends Module
提示:您的 "registerHook" 函数不应位于构造函数中。它必须在安装函数中。