使用 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 之前被调用 loadedmod_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");
    }
}