使用 mod_perl 时未调用自定义 Bugzilla 挂钩
Custom Bugzilla hook not invoked when using mod_perl
我已将自定义挂钩添加到 Bugzilla/Install/Util.pm
:
# Used by template_include_path.
sub _template_base_directories {
# ...
Bugzilla::Hook::process('template_dirs_alter', { template_dirs => \@template_dirs });
# ...
return \@template_dirs;
}
当通过cgi执行时,一切正常,但是使用mod_perl
我可以看到使用warn()
语句上面的过程语句是为自定义钩子执行的,但实际的钩子实现从来没有已调用。
在Bugzilla/Hook.pm
中:
sub process {
my ($name, $args) = @_;
# ...
foreach my $extension (@{ Bugzilla->extensions }) {
if ($extension->can($name)) {
# log shows the expected hook name and extension
# so the hook implementation is found
$extension->$name($args); # should invoke hook implementation, but doesn't
}
}
# ...
}
钩子在 Extension.pm 中实现,如下所示:
sub template_dirs_alter {
my ($self, $args) = @_;
my ($template_dirs) = @$args{qw(template_dirs)};
if($something) {
push(@$template_dirs, "some/dir/path");
}
}
我在这里缺少 mod_perl and/or Bugzilla hook/extension 系统的任何明显陷阱?
我猜测 _template_base_directories()
在 extensions
之前被调用 loaded
在 mod_perl
之下。如果是这样,那就是一个错误,应该修复。
虽然 cwd
在使用 cgi
时通常是 Bugzilla root,但在使用 mod_perl
时它可以是任何东西(例如 apache home)。
在 Bugzilla 扩展中使用文件路径时,始终前缀相对路径:
use File::Basename qw(dirname);
our $BASEDIR = dirname(__FILE__);
sub template_dirs_alter {
my ($self, $args) = @_;
my ($template_dirs) = @$args{qw(template_dirs)};
if($something) {
push(@$template_dirs, $BASEDIR . "some/dir/path");
}
}
我已将自定义挂钩添加到 Bugzilla/Install/Util.pm
:
# Used by template_include_path.
sub _template_base_directories {
# ...
Bugzilla::Hook::process('template_dirs_alter', { template_dirs => \@template_dirs });
# ...
return \@template_dirs;
}
当通过cgi执行时,一切正常,但是使用mod_perl
我可以看到使用warn()
语句上面的过程语句是为自定义钩子执行的,但实际的钩子实现从来没有已调用。
在Bugzilla/Hook.pm
中:
sub process {
my ($name, $args) = @_;
# ...
foreach my $extension (@{ Bugzilla->extensions }) {
if ($extension->can($name)) {
# log shows the expected hook name and extension
# so the hook implementation is found
$extension->$name($args); # should invoke hook implementation, but doesn't
}
}
# ...
}
钩子在 Extension.pm 中实现,如下所示:
sub template_dirs_alter {
my ($self, $args) = @_;
my ($template_dirs) = @$args{qw(template_dirs)};
if($something) {
push(@$template_dirs, "some/dir/path");
}
}
我在这里缺少 mod_perl and/or Bugzilla hook/extension 系统的任何明显陷阱?
我猜测 _template_base_directories()
在 extensions
之前被调用 loaded
在 mod_perl
之下。如果是这样,那就是一个错误,应该修复。
虽然 cwd
在使用 cgi
时通常是 Bugzilla root,但在使用 mod_perl
时它可以是任何东西(例如 apache home)。
在 Bugzilla 扩展中使用文件路径时,始终前缀相对路径:
use File::Basename qw(dirname);
our $BASEDIR = dirname(__FILE__);
sub template_dirs_alter {
my ($self, $args) = @_;
my ($template_dirs) = @$args{qw(template_dirs)};
if($something) {
push(@$template_dirs, $BASEDIR . "some/dir/path");
}
}