Какой крючок нужно подключить, чтобы определить, когда добавляется новый комментарий к ошибке?В расширении Bugzilla, как можно добавить новый комментарий?
Мой прецедент заключается в том, что всякий раз, когда добавляется комментарий, мне нужно обработать все комментарии и выполнить какое-то действие на основе этого. Однако это действие «дорого», поэтому я не хочу выполнять действие, если комментарий не был добавлен.
Единственный способ, который я нашел до сих пор, чтобы определить это крюк в object_end_of_update
с кодом:
sub object_end_of_update {
my ($self, $args) = @_;
my ($object, $old_object, $changes) = @$args{qw(object old_object changes)};
print STDERR "--- Object Type: " . ref $object;
if ($object->isa('Bugzilla::Bug')) {
# Load comments on the old object here, otherwise by the time we get
# to bug_end_of_update it is too late, and we cannot determine if a
# new comment has been added or not.
$old_object->comments({order=>'oldest_to_newest'});
}
}
, а затем крючок в bug_end_of_update
, после чего я могу сделать что-то вроде:
sub bug_end_of_update {
my ($self, $args) = @_;
my ($bug, $old_bug, $timestamp, $changes) = @$args{qw(bug old_bug timestamp changes)};
# Note that this will only work if the old comments have already been
# loaded in object_end_of_update, otherwise when we get the old comments
# here, it just goes to the DB, and gets all of the comments, including
# the new one, if there is one.
my $oldComments = $old_bug->comments({order=>'oldest_to_newest'});
my $newComments = $bug->comments({order=>'oldest_to_newest'});
if (scalar(@$newComments) > scalar(@$oldComments)) {
# If we added a new comment, then perform processing.
do_slow_action($bug);
}
}
Однако это чувствует себя хрупким, и даже если это не так, это определенно непонятный код.
Каков правильный способ определить, что комментарий добавлен в ошибку bugzilla?
Хотя я знаю, что это можно назвать веб-службы из базы данных, этот конец будет до распространения логики в большем количестве мест, чем хотелось бы. –