You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bugzilla 5.2+通过REST API创建Bug时设置指定上报人问题

Bugzilla 5.2+ REST API自定义上报人扩展修复方案

问题根源

  1. 持久化失效:原代码直接修改Bug对象的哈希属性(如$object->{'reporter'}),Bugzilla的对象变更跟踪系统无法识别这类修改,调用update()时不会同步到数据库,仅会在内存中临时生效。
  2. 参数无法动态获取:硬编码用户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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 13:42:43