Bugzilla 5.2+通过REST API创建Bug时设置指定上报人问题
Bugzilla 5.2+ REST API自定义上报人扩展修复方案
问题根源
- 持久化失效:原代码直接修改Bug对象的哈希属性(如
$object->{'reporter'}),Bugzilla的对象变更跟踪系统无法识别这类修改,调用update()时不会同步到数据库,仅会在内存中临时生效。 - 参数无法动态获取:硬编码用户ID,无法从API请求负载中读取自定义上报人信息。
修正后的扩展代码
package Bugzilla::Extension::MyExtension; use strict; use base qw(Bugzilla::Extension); our $VERSION = '1.0'; use constant NAME => 'MyExtension'; # 在Bug创建验证完成后、对象落地前处理自定义上报人参数 sub bug_end_of_create_validators { my ($self, $args) = @_; my $params = $args->{'params'}; my $bug = $args->{'bug'}; # 从API请求中获取自定义上报人ID(可替换为reporter_email) if (my $reporter_id = $params->{'reporter_id'}) { # 验证用户合法性 my $reporter = Bugzilla::User->check({ id => $reporter_id }); # 使用官方setter标记字段变更 $bug->set_reporter($reporter); # 若需修改creator(需管理员权限,谨慎使用) # $bug->set('creator', $reporter->login); } } __PACKAGE__->NAME;
关键说明
- 使用官方setter方法:
set_reporter()会自动标记字段为"脏字段",Bug对象保存时会同步修改到数据库,彻底解决持久化问题。 - 钩子时机选择:
bug_end_of_create_validators在参数验证完成后、Bug落地前触发,无需创建后再修改,逻辑更高效。 - API请求传参:调用REST API创建Bug时,在请求负载中加入自定义参数即可,示例:
{ "product": "你的产品名", "component": "你的组件名", "summary": "测试Bug", "description": "API创建的Bug", "reporter_id": 3 } - 权限限制:修改
reporter需要API调用用户拥有editbugs权限;修改creator属于敏感操作,需管理员权限,且不建议随意更改(creator字段本意是记录实际创建Bug的用户)。
原代码问题总结
- 直接操作对象哈希属性,未触发Bugzilla的变更跟踪机制。
- 硬编码用户ID,无法适配动态业务需求。
- 选择
object_end_of_create钩子时机错误,导致修改仅内存生效。
内容的提问来源于stack exchange,提问作者MSauer
相关产品推荐
相关产品推荐

