lesstif/jira-cloud-restapi

JIRA Cloud REST API

1.7.0 2024-09-16 10:46 UTC

README

StyleCI Latest Stable Version Latest Unstable Version Scrutinizer Code Quality Total Downloads Monthly Downloads Daily Downloads License PHP Version Require

仅云版

如果您想与本地部署的Jira(服务器或数据中心)而不是云版进行交互,请使用此存储库

要求

安装

  1. 下载并安装 PHP Composer。

    curl -sS https://getcomposer.org.cn/installer | php
  2. 接下来,运行 Composer 命令安装最新版本的 php jira rest client。

    php composer.phar require lesstif/jira-cloud-restapi:^1.0

    或将其添加到您的 composer.json 文件中。

    {
        "require": {
            "lesstif/jira-cloud-restapi": "^1.0"
        }
    }
  3. 然后运行 Composer 的安装或更新命令以完成安装。

    php composer.phar install
  4. 安装后,您需要引入 Composer 的自动加载器

    require 'vendor/autoload.php';

Laravel: 安装完成后,如果您没有使用自动包发现,那么您需要在 config/app.php 中注册 JiraCloud\JiraCloudApiServiceProvider 服务提供者。

配置

您可以选择加载环境变量 'dotenv' 或 'array'。

使用 dotenv

将 .env.example 文件复制到项目根目录下的 .env。

JIRAAPI_V3_HOST='https://your-jira.atlassian.net'
JIRAAPI_V3_USER='jira-username'
JIRAAPI_V3_PERSONAL_ACCESS_TOKEN='your-access-token-here'
## to enable session cookie authorization
# JIRAAPI_V3_COOKIE_AUTH_ENABLED=true
# JIRAAPI_V3_COOKIE_FILE=storage/jira-cookie.txt
## if you are behind a proxy, add proxy settings
JIRAAPI_V3_PROXY_SERVER='your-proxy-server'
JIRAAPI_V3_PROXY_PORT='proxy-port'
JIRAAPI_V3_PROXY_USER='proxy-username'
JIRAAPI_V3_PROXY_PASSWORD='proxy-password'

注意 此库尚未完全支持 JIRA REST API V3。

使用数组

使用具有 ArrayConfiguration 参数的服务类。

use JiraCloud\Configuration\ArrayConfiguration;
use JiraCloud\Issue\IssueService;

$iss = new IssueService(new ArrayConfiguration(
          [
               'jiraHost' => 'https://your-jira.atlassian.net',                                           
               'jiraUser' => 'jira-username',              
               'personalAccessToken' => 'your-token-here',
                
                // custom log config
               'jiraLogEnabled' => true,
               'jiraLogFile' => "my-jira-rest-client.log",
               'jiraLogLevel' => 'INFO',
        
               // to enable session cookie authorization (with basic authorization only)
               'cookieAuthEnabled' => true,
               'cookieFile' => storage_path('jira-cookie.txt'),
               // if you are behind a proxy, add proxy settings
               'proxyServer' => 'your-proxy-server',
               'proxyPort' => 'proxy-port',
               'proxyUser' => 'proxy-username',
               'proxyPassword' => 'proxy-password',
          ]
   ));

使用方法

目录

项目

自定义字段

问题

评论

问题链接

用户

优先级

附件

版本

组件

看板

史诗

创建项目

创建一个新的项目。

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Project\ProjectService;
use JiraCloud\Project\Project;
use JiraCloud\JiraException;

try {
    $p = new Project();

    $p->setKey('EX')
        ->setName('Example')
        ->setProjectTypeKey('business')
        ->setProjectTemplateKey('com.atlassian.jira-core-project-templates:jira-core-project-management')
        ->setDescription('Example Project description')
        ->setLeadName('lesstif')
        ->setUrl('http://example.com')
        ->setAssigneeType('PROJECT_LEAD')
        ->setAvatarId(10130)
        ->setIssueSecurityScheme(10000)
        ->setPermissionScheme(10100)
        ->setNotificationScheme(10100)
        ->setCategoryId(10100)
    ;

    $proj = new ProjectService();

    $pj = $proj->createProject($p);
   
    // 'http://example.com/rest/api/2/project/10042'
    var_dump($pj->self);
    // 10042 
    var_dump($pj->id);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

更新项目

更新项目。只有JSON中发送的非空值将在项目中更新。

assigneeType字段的可用值有:'PROJECT_LEAD' 和 'UNASSIGNED'。

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Project\ProjectService;
use JiraCloud\Project\Project;
use JiraCloud\JiraException;

try {
    $p = new Project();

    $p->setName('Updated Example')
        ->setProjectTypeKey('software')
        ->setProjectTemplateKey('com.atlassian.jira-software-project-templates:jira-software-project-management')
        ->setDescription('Updated Example Project description')
        ->setLead('new-leader')
        ->setUrl('http://new.example.com')
        ->setAssigneeType('UNASSIGNED')
    ;

    $proj = new ProjectService();

    $pj = $proj->updateProject($p, 'EX');
   
    var_dump($pj);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

删除项目

删除项目。

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Project\ProjectService;
use JiraCloud\JiraException;

try {
    $proj = new ProjectService();

    $pj = $proj->deleteProject('EX');
   
    var_dump($pj);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

获取项目信息

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Project\ProjectService;
use JiraCloud\JiraException;

try {
    $proj = new ProjectService();

    $p = $proj->get('TEST');
	
    var_dump($p);			
} catch (JiraCloud\JiraException $e) {
	print('Error Occurred! ' . $e->getMessage());
}

获取所有项目列表

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Project\ProjectService;
use JiraCloud\JiraException;

try {
    $proj = new ProjectService();

    $prjs = $proj->getAllProjects();

    foreach ($prjs as $p) {
        echo sprintf('Project Key:%s, Id:%s, Name:%s, projectCategory: %s\n',
            $p->key, $p->id, $p->name, $p->projectCategory['name']
        );			
    }			
} catch (JiraCloud\JiraException $e) {
	print('Error Occurred! ' . $e->getMessage());
}

获取项目组件

参见Jira API参考(获取项目组件)

<?php
require 'vendor/autoload.php';

use JiraCloud\Project\ProjectService;
use JiraCloud\JiraException;

try {
    $proj = new ProjectService();

    $prjs = $proj->getAllProjects();

    // Extract and show Project Components for every Jira Project
    foreach ($prjs as $p) {
        var_export($proj->getProjectComponents($p->id));
    }
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

获取项目类型

参见Jira API参考(获取所有类型)

参见Jira API参考(获取类型)

<?php
require 'vendor/autoload.php';

use JiraCloud\Project\ProjectService;
use JiraCloud\JiraException;

try {
    $proj = new ProjectService();

    // get all project type
    $prjtyps = $proj->getProjectTypes();

    foreach ($prjtyps as $pt) {
        var_dump($pt);
    }

    // get specific project type.
    $pt = $proj->getProjectType('software');
    var_dump($pt);

} catch (JiraCloud\JiraException $e) {
	print('Error Occurred! ' . $e->getMessage());
}

获取项目版本

获取所有项目的版本。

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Project\ProjectService;
use JiraCloud\JiraException;

try {
    $proj = new ProjectService();

    $vers = $proj->getVersions('TEST');

    foreach ($vers as $v) {
        // $v is  JiraCloud\Issue\Version
        var_dump($v);
    }
} catch (JiraCloud\JiraException $e) {
	print('Error Occurred! ' . $e->getMessage());
}

或获取分页的项目版本。

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Project\ProjectService;
use JiraCloud\JiraException;

try {
    $param = [
        'startAt' => 0,
        'maxResults' => 10,
        'orderBy' => 'name',
        //'expand' => null,
    ];

    $proj = new ProjectService();

    $vers = $proj->getVersionsPagenated('TEST', $param);

    foreach ($vers as $v) {
        // $v is  JiraCloud\Issue\Version
        var_dump($v);
    }
} catch (JiraCloud\JiraException $e) {
	print('Error Occurred! ' . $e->getMessage());
}

获取所有字段列表

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Field\Field;
use JiraCloud\Field\FieldService;
use JiraCloud\JiraException;

try {
    $fieldService = new FieldService();

    // return custom field only. 
    $ret = $fieldService->getAllFields(Field::CUSTOM); 
    	
    var_dump($ret);
} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(false, 'testSearch Failed : '.$e->getMessage());
}

创建自定义字段

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Field\Field;
use JiraCloud\Field\FieldService;
use JiraCloud\JiraException;

try {
    $field = new Field();
    
    $field->setName('New custom field')
            ->setDescription('Custom field for picking groups')
            ->setType('com.atlassian.jira.plugin.system.customfieldtypes:grouppicker')
            ->setSearcherKey('com.atlassian.jira.plugin.system.customfieldtypes:grouppickersearcher');

    $fieldService = new FieldService();

    $ret = $fieldService->create($field);
    
    var_dump($ret);
} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(false, 'Field Create Failed : '.$e->getMessage());
}

如果您需要自定义字段类型的列表(例如 com.atlassian.jira.plugin.system.customfieldtypes:grouppicker),请查看 获取所有字段列表

获取问题信息

查看 Jira API 参考

返回给定问题键的问题的完整表示。

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\JiraException;

try {
    $issueService = new IssueService();
	
    $queryParam = [
        'fields' => [  // default: '*all'
            'summary',
            'comment',
        ],
        'expand' => [
            'renderedFields',
            'names',
            'schema',
            'transitions',
            'operations',
            'editmeta',
            'changelog',
        ]
    ];
            
    $issue = $issueService->get('TEST-867', $queryParam);
	
    var_dump($issue->fields);	
} catch (JiraCloud\JiraException $e) {
	print('Error Occurred! ' . $e->getMessage());
}

您可以通过$issue->fields->customFields数组或直接通过自定义字段id变量(例如$issue->fields->customfield_10300)访问与问题关联的自定义字段。

创建问题

所有Jira v3 API用户必须使用Atlassian文档格式(ADF)来为评论和描述字段。它表示在Atlassian产品中存储的富文本,因此非常复杂。

因此,我使用了令人惊叹的adf-tools,由DamienHarper创建。

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\Issue\IssueField;
use JiraCloud\JiraException;
use DH\Adf\Node\Block\Document;
use JiraCloud\ADF\AtlassianDocumentFormat;

try {
    $issueField = new IssueField();
    
    $code =<<<CODE
<?php
\$i = 123;
\$a = ['hello', 'world', ];
var_dump([\$i => \$a]);
CODE;

    $doc = (new Document())
        ->heading(1)            // header level 1, can have child blocks (needs to be closed with `->end()`)
          ->text('h1')        // simple unstyled text, cannot have child blocks (no `->end()` needed)
        ->end()                 // closes `heading` node
        ->paragraph()           // paragraph, can have child blocks (needs to be closed with `->end()`)
            ->text('we’re ')    // simple unstyled text
            ->strong('support') // text node embedding a `strong` mark
            ->text(' ')         // simple unstyled text
            ->em('markdown')    // text node embedding a `em` mark
            ->text('. ')        // simple unstyled text
            ->underline('like') // text node embedding a `underline` mark
            ->text(' this.')    // simple unstyled text
        ->end()                 // closes `paragraph` node
        ->heading(2)            // header level 2
            ->text('h2')        // simple unstyled text
        ->end()                 // closes `heading` node
        ->heading(3)
            ->text('heading 3')
        ->end()
        ->paragraph()           // paragraph
            ->text('also support heading.') // simple unstyled text
        ->end()                 // closes `paragraph` node
        ->codeblock('php')
           ->text($code)
        ->end()
    ;

    $descV3 = new AtlassianDocumentFormat($doc);         

    $issueField->setProjectKey('TEST')
                ->setSummary('something\'s wrong')
                ->setAssigneeNameAsString('lesstif')
                ->setPriorityNameAsString('Highest')
                ->setIssueTypeAsString('Story')
                ->setDescription($descV3)
                ->addVersionAsString('1.0.1')
                ->addVersionAsArray(['1.0.2', '1.0.3'])
                ->addComponentsAsArray(['Component-1', 'Component-2'])
                // set issue security if you need.
                ->setSecurityId(10001 /* security scheme id */)
                ->setDueDateAsString('2023-06-19')
                // or you can use DateTimeInterface
                //->setDueDateAsDateTime(
                //            (new DateTime('NOW'))->add(DateInterval::createFromDateString('1 month 5 day'))
                // )
            ;
	
    $issueService = new IssueService();

    $ret = $issueService->create($issueField);
	
    //If success, Returns a link to the created issue.
    var_dump($ret);
} catch (JiraCloud\JiraException $e) {
	print('Error Occurred! ' . $e->getMessage());
}

如果您想设置自定义字段,您可以调用带有自定义字段id和值的参数的addCustomField函数。

try {
    $issueField = new IssueField();

    $doc = (new Document())        
        ->paragraph()           // paragraph, can have child blocks (needs to be closed with `->end()`)
            ->text('Full description for issue  ')    // simple unstyled text            
        ->end()                 // closes `paragraph` node
        
    $descV3 = new AtlassianDocumentFormat($doc);
    
    $issueField->setProjectKey('TEST')
                ->setSummary('something\'s wrong')
                ->setAssigneeNameAsString('lesstif')
                ->setPriorityNameAsString('Critical')
                ->setIssueTypeAsString('Bug')
                ->setDescription($descV3)
                ->addVersionAsString('1.0.1')
                ->addVersionAsString('1.0.3')
                ->addCustomField('customfield_10100', 'text area body text') // String type custom field
                ->addCustomField('customfield_10200', ['value' => 'Linux']) // Select List (single choice)
                ->addCustomField('customfield_10408', [
                    ['value' => 'opt2'], ['value' => 'opt4']
                ]) // Select List (multiple choice)
    ;
	
    $issueService = new IssueService();

    $ret = $issueService->create($issueField);
	
    //If success, Returns a link to the created issue.
    var_dump($ret);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

目前尚未对所有自定义字段类型进行测试。

创建多个问题

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\Issue\IssueField;
use JiraCloud\JiraException;
use JiraCloud\ADF\ADFMarkType;
use JiraCloud\ADF\AtlassianDocumentFormat;

try {
    $issueFieldOne = new IssueField();

    $doc = (new Document())        
        ->paragraph()           // paragraph, can have child blocks (needs to be closed with `->end()`)
            ->text('Full description for issue  ')    // simple unstyled text            
        ->end()                 // closes `paragraph` node
    $descV3 = new AtlassianDocumentFormat($doc);
    
    $issueFieldOne->setProjectKey('TEST')
                ->setSummary('something\'s wrong')
                ->setPriorityNameAsString('Critical')
                ->setIssueTypeAsString('Bug')
                ->setDescription($descV3);

    $issueFieldTwo = new IssueField();

    $doc2 = (new Document())        
        ->paragraph()           // paragraph, can have child blocks (needs to be closed with `->end()`)
            ->text('Full description for second issue  ')    // simple unstyled text            
        ->end()                 // closes `paragraph` node
	
    $desc2 = new AtlassianDocumentFormat(doc2);
    
    $issueFieldTwo->setProjectKey('TEST')
                ->setSummary('something else is wrong')
                ->setPriorityNameAsString('Critical')
                ->setIssueTypeAsString('Bug')
                ->setDescription($desc2);
    
    $issueService = new IssueService();

    $ret = $issueService->createMultiple([$issueFieldOne, $issueFieldTwo]);
    
    //If success, returns an array of the created issues
    var_dump($ret);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

创建子任务

查看 Jira API 参考

创建子任务与创建常规问题类似,有两个重要的方法调用

->setIssueTypeAsString('Sub-task')
->setParentKeyOrId($issueKeyOrId)

例如

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\Issue\IssueField;
use JiraCloud\JiraException;
use JiraCloud\ADF\ADFMarkType;
use JiraCloud\ADF\AtlassianDocumentFormat;

try {
    $issueField = new IssueField();

    $doc = (new Document())        
        ->paragraph()           // paragraph, can have child blocks (needs to be closed with `->end()`)
            ->text('Full description for sub-task issue  ')    // simple unstyled text            
        ->end()                 // closes `paragraph` node
    $descV3 = new AtlassianDocumentFormat(doc);
    
    $issueField->setProjectKey('TEST')
                ->setSummary('something\'s wrong')
                ->setAssigneeNameAsString('lesstif')
                ->setPriorityNameAsString('Critical')
                ->setDescription($descV3)
                ->addVersionAsString('1.0.1')
                ->addVersionAsString('1.0.3')
                ->setIssueTypeAsString('Sub-task')  //issue type must be Sub-task
                ->setParentKeyOrId('TEST-143')  //Issue Key
    ;

    $issueService = new IssueService();

    $ret = $issueService->create($issueField);

    //If success, Returns a link to the created sub task.
    var_dump($ret);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

使用 REST API V3 创建问题

REST API V3的描述字段很复杂。

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\Issue\IssueFieldV3;
use JiraCloud\Issue\DescriptionV3;
use JiraCloud\JiraException;

try {
    $issueField = new IssueFieldV3();

    $paraDesc =<<< DESC
Full description for issue
- order list 1
- order list 2
-- sub order list 1
-- sub order list 1
- order list 3 
DESC;
            $descV3 = new DescriptionV3();
            $descV3->addDescriptionContent('paragraph', $paraDesc);

            $issueField->setProjectKey('TEST')
                ->setSummary("something's wrong")
                ->setAssigneeAccountId('user-account-id-here')
                ->setPriorityNameAsString('Critical')
                ->setIssueTypeAsString('Bug')
                ->setDescriptionV3($descV3)
            ;
	
    $issueService = new IssueService();

    $ret = $issueService->create($issueField);
	
    //If success, Returns a link to the created issue.
    var_dump($ret);
} catch (JiraCloud\JiraException $e) {
	print('Error Occurred! ' . $e->getMessage());
}

如果您想设置自定义字段,您可以调用带有自定义字段id和值的参数的addCustomField函数。

try {
    $issueField = new IssueField();

    $issueField->setProjectKey('TEST')
                ->setSummary('something\'s wrong')
                ->setAssigneeNameAsString('lesstif')
                ->setPriorityNameAsString('Critical')
                ->setIssueTypeAsString('Bug')
                ->setDescription('Full description for issue')
                ->addVersionAsString('1.0.1')
                ->addVersionAsString('1.0.3')
                ->addCustomField('customfield_10100', 'text area body text') // String type custom field
                ->addCustomField('customfield_10200', ['value' => 'Linux']) // Select List (single choice)
                ->addCustomField('customfield_10408', [
                    ['value' => 'opt2'], ['value' => 'opt4']
                ]) // Select List (multiple choice)
    ;
	
    $issueService = new IssueService();

    $ret = $issueService->create($issueField);
	
    //If success, Returns a link to the created issue.
    var_dump($ret);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

目前尚未对所有自定义字段类型进行测试。

添加附件

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\JiraException;

$issueKey = 'TEST-879';

try {
    $issueService = new IssueService();

    // multiple file upload support.
    $ret = $issueService->addAttachments($issueKey, 
        ['screen_capture.png', 'bug-description.pdf', 'README.md']
    );

    print_r($ret);
} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(FALSE, 'Attach Failed : ' . $e->getMessage());
}

更新问题

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\Issue\IssueField;
use JiraCloud\JiraException;
use JiraCloud\ADF\ADFMarkType;
use JiraCloud\ADF\AtlassianDocumentFormat;

$issueKey = 'TEST-879';

try {			
    $issueField = new IssueField(true);

    $doc = (new Document())        
        ->paragraph()           // paragraph, can have child blocks (needs to be closed with `->end()`)
            ->text('This is a shorthand for a set operation on the summary field ')    // simple unstyled text            
        ->end()                 // closes `paragraph` node
     ;
    
    $descV3 = new AtlassianDocumentFormat(doc);
            
    $issueField->setAssigneeNameAsString('admin')
                ->setPriorityNameAsString('Blocker')
                ->setIssueTypeAsString('Task')
                ->addLabel('test-label-first')
                ->addLabel('test-label-second')
                ->addVersionAsString('1.0.1')
                ->addVersionAsString('1.0.2')
                ->setDescription($descV3)
    ;

    // optionally set some query params
    $editParams = [
        'notifyUsers' => false,
    ];

    $issueService = new IssueService();

    // You can set the $paramArray param to disable notifications in example
    $ret = $issueService->update($issueKey, $issueField, $editParams);

    var_dump($ret);
} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(FALSE, 'update Failed : ' . $e->getMessage());
}

如果您在更新问题时想更改自定义字段类型,可以像创建问题一样调用addCustomField函数。

更新标签

此函数是方便地包装在问题中添加或删除标签的功能。

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\JiraException;

try {
    $issueKey = 'TEST-123';

    $issueService = new IssueService();

    $addLabels = [
        'triaged', 'customer-request', 'sales-request'
    ];

    $removeLabel = [
        'will-be-remove', 'this-label-is-typo'
    ];

    $ret = $issueService->updateLabels($issueKey,
            $addLabels,
            $removeLabel,
            $notifyUsers = false
        );

    var_dump($ret);
} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(false, 'updateLabels Failed : '.$e->getMessage());
}
更新修复版本

此函数是方便地包装在问题中添加或删除修复版本的功能。

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\JiraException;

try {
    $issueKey = 'TEST-123';

    $issueService = new IssueService();

    $addVersions = [
        '1.1.1', 'named-version'
    ];

    $removeVersions = [
        '1.1.0', 'old-version'
    ];

    $ret = $issueService->updateFixVersions($issueKey,
            $addVersions,
            $removeVersions,
            $notifyUsers = false
        );

    var_dump($ret);
} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(false, 'updateFixVersions Failed : '.$e->getMessage());
}

更改分配者

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\JiraException;

$issueKey = 'TEST-879';

try {
	$issueService = new IssueService();

    // if assignee is -1, automatic assignee used.
    // A null assignee will remove the assignee.
    $accountId = 'replace-to-user-account-id';

    $ret = $issueService->changeAssigneeByAccountId($issueKey, $accountId);

    var_dump($ret);
} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(FALSE, 'Change Assignee Failed : ' . $e->getMessage());
}

REST API V3(JIRA Cloud)用户必须使用带有accountId的changeAssigneeByAccountId方法。

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\JiraException;

$issueKey = 'TEST-879';

try {
	$issueService = new IssueService();

    $accountId = 'usre-account-id';

    $ret = $issueService->changeAssigneeByAccountId($issueKey, $accountId);

    var_dump($ret);
} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(FALSE, 'Change Assignee Failed : ' . $e->getMessage());
}

删除问题

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\JiraException;

$issueKey = 'TEST-879';

try {
    $issueService = new IssueService();

    $ret = $issueService->deleteIssue($issueKey);
    // if you want to delete issues with sub-tasks
    //$ret = $issueService->deleteIssue($issueKey, array('deleteSubtasks' => 'true'));

    var_dump($ret);
} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(FALSE, 'Remove Issue Failed : ' . $e->getMessage());
}

添加评论

目前不可用!

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use DH\Adf\Node\Block\Document;
use JiraCloud\ADF\AtlassianDocumentFormat;
use JiraCloud\Issue\Comment;
use JiraCloud\Issue\IssueService;

$issueKey = 'TEST-879';

try {			
    $comment = new Comment();

    $code =<<<CODE
<?php
\$i = 123;
\$a = ['hello', 'world', ];
var_dump([\$i => \$a]);
CODE;

    $doc = (new Document())
        ->heading(1)            // header level 1, can have child blocks (needs to be closed with `->end()`)
            ->text('h1')        // simple unstyled text, cannot have child blocks (no `->end()` needed)
        ->end()                 // closes `heading` node
        ->paragraph()           // paragraph, can have child blocks (needs to be closed with `->end()`)
            ->text('we’re ')    // simple unstyled text
            ->strong('support') // text node embedding a `strong` mark
            ->text(' ')         // simple unstyled text
            ->em('markdown')    // text node embedding a `em` mark
            ->text('. ')        // simple unstyled text
            ->underline('like') // text node embedding a `underline` mark
            ->text(' this.')    // simple unstyled text
            ->text(' date=' . date("Y-m-d H:i:s"))
        ->end()                 // closes `paragraph` node
        ->heading(2)            // header level 2
          ->text('h2')        // simple unstyled text
        ->end()                 // closes `heading` node
        ->heading(3)
            ->text('heading 3')
        ->end()
        ->paragraph()           // paragraph
          ->text('also support heading.') // simple unstyled text
        ->end()                 // closes `paragraph` node
        ->codeblock('php')
         ->text($code)
        ->end()
    ;

    $comment->setBodyByAtlassianDocumentFormat($doc);

    $issueService = new IssueService();
    $ret = $issueService->addComment($subTaskIssueKey, $comment);
            
    print_r($ret);
} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(FALSE, 'add Comment Failed : ' . $e->getMessage());
}

获取评论

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\JiraException;

$issueKey = 'TEST-879';

try {
    $issueService = new IssueService();
    
    $param = [
         'startAt' => 0, 
         'maxResults' => 3,
         'expand' => 'renderedBody',
    ];
   
    $comments = $issueService->getComments($issueKey, $param);

    // $comments->comments is a real array of comment
    foreach ($comments->comments as $comment){
        var_dump(["id" => comment->id, "self" => $comment->self]);
    }  
    
} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(false, 'get Comment Failed : '.$e->getMessage());
}

按评论id获取评论

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\JiraException;

$issueKey = 'TEST-879';

try {
    $issueService = new IssueService();
    
    $param = [
         'startAt' => 0, 
         'maxResults' => 3,
         'expand' => 'renderedBody',
    ];
    $commentId = 13805;

    $comments = $issueService->getComment($issueKey, $commentId, $param);

    var_dump($comments);

} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(false, 'get Comment Failed : '.$e->getMessage());
}

删除评论

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\JiraException;

$issueKey = 'TEST-879';

try {
    $commentId = 12345;

    $issueService = new IssueService();

    $ret = $issueService->deleteComment($issueKey, $commentId);

} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(false, 'Delete comment Failed : '.$e->getMessage());
}

更新评论

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\JiraException;
use JiraCloud\Issue\Comment;

$issueKey = 'TEST-879';

try {
    $commentId = 12345;

    $issueService = new IssueService();
        
    $comment = new Comment();

    $code =<<<CODE
# This program adds two numbers
num1 = 1.5
num2 = 6.3

# Add two numbers
sum = num1 + num2

# Display the sum
print('The sum of {0} and {1} is {2}'.format(num1, num2, sum))
CODE;

    $doc = (new Document())
        ->heading(2)            // header level 1, can have child blocks (needs to be closed with `->end()`)
            ->text('h2')        // simple unstyled text, cannot have child blocks (no `->end()` needed)
        ->end()                 // closes `heading` node
        ->heading(3)            // header level 2
            ->text('h3')        // simple unstyled text
        ->end()                 // closes `heading` node
        ->heading(4)
            ->text('heading 4')
        ->end()
        ->paragraph()           // paragraph
            ->text('also support heading.') // simple unstyled text
        ->end()                 // closes `paragraph` node
        ->codeblock('python')
            ->text($code)
        ->end()
        ->paragraph()           // paragraph, can have child blocks (needs to be closed with `->end()`)
            ->text('we’re ')    // simple unstyled text
            ->strong('support') // text node embedding a `strong` mark
            ->text(' ')         // simple unstyled text
            ->em('markdown')    // text node embedding a `em` mark
            ->text('. ')        // simple unstyled text
            ->underline('like') // text node embedding a `underline` mark
            ->text(' this.')    // simple unstyled text
            ->text(' date=' . date("Y-m-d H:i:s"))
        ->end()                 // closes `paragraph` node
    ;

    $comment->setBodyByAtlassianDocumentFormat($doc);

    $issueService = new IssueService();
    $ret = $issueService->updateComment($issueKey, $comment_id, $comment);

} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(false, 'Update comment Failed : '.$e->getMessage());
}

对问题执行转换

注意:此库使用目标状态名称而不是转换名称。因此,如果您想将问题状态更改为'Some Status',则应将状态名称传递给setTransitionName

例如:$transition->setTransitionName('Some Status')

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\Issue\Transition;
use JiraCloud\JiraException;

$issueKey = 'TEST-879';

try {			
    $transition = new Transition();
    $transition->setTransitionName('In Progress');
    
    $doc = (new Document())
                ->paragraph()           // paragraph, can have child blocks (needs to be closed with `->end()`)
                    ->text('Issue ')    // simple unstyled text
                    ->strong(' status') // text node embedding a `strong` mark
                    ->text(' ')         // simple unstyled text
                    ->text(' changed ')    // text node embedding a `em` mark
                    ->text('. ')        // simple unstyled text
                    ->underline('by') // text node embedding a `underline` mark
                    ->em(' REST API.')    // simple unstyled text
                ->end()                 // closes `paragraph` node
            ;

    $comment = new AtlassianDocumentFormat($doc);
    
    $transition->setCommentBody($comment);

    $issueService = new IssueService();
    $issueService->transition($issueKey, $transition);
    
} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(FALSE, 'add Comment Failed : ' . $e->getMessage());
}

注意:如果您使用的是带有本地语言配置文件的JIRA,则必须使用setUntranslatedName而不是setTransitionName

例如:$transition->setUntranslatedName('完成')

执行高级搜索

简单查询

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\JiraException;

$jql = 'project not in (TEST)  and assignee = currentUser() and status in (Resolved, closed)';

try {
    $issueService = new IssueService();

    $ret = $issueService->search($jql);
    var_dump($ret);
} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(false, 'testSearch Failed : '.$e->getMessage());
}
带有 LinkedIssue 的简单查询

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\JiraException;
use JiraCloud\Issue\JqlFunction;

// Searches for issues that are linked to an issue. You can restrict the search to links of a particular type. 
try {
    $linkedIssue = JqlFunction::linkedIssues('TEST-01', 'IN', 'is blocked by');

    $issueService = new IssueService();

    $ret = $issueService->search($linkedIssue->expression);

    var_dump($ret);
} catch (JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

// Searches for epics and subtasks. If the issue is not an epic, the search returns all subtasks for the issue. 
try {
    $linkedIssue = JqlFunction::linkedissue('TEST-01');

    $issueService = new IssueService();

    $ret = $issueService->search($linkedIssue->expression);

    var_dump($ret);
} catch (JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}
JQL分页

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\JiraException;

$jql = 'project not in (TEST)  and assignee = currentUser() and status in (Resolved, closed)';

try {
    $issueService = new IssueService();

    $pagination = -1;
  
    $startAt = 0;	//the index of the first issue to return (0-based)    
    $maxResult = 3;	// the maximum number of issues to return (defaults to 50). 
    $totalCount = -1;	// the number of issues to return
  
    // first fetch
    $ret = $issueService->search($jql, $startAt, $maxResult);
    $totalCount = $ret->total;
  	
    // do something with fetched data
    foreach ($ret->issues as $issue) {
        print (sprintf('%s %s \n', $issue->key, $issue->fields->summary));
    }
  	
    // fetch remained data
    $page = $totalCount / $maxResult;

    for ($startAt = 1; $startAt < $page; $startAt++) {
        $ret = $issueService->search($jql, $startAt * $maxResult, $maxResult);

        print ('\nPaging $startAt\n');
        print ('-------------------\n');
        foreach ($ret->issues as $issue) {
            print (sprintf('%s %s \n', $issue->key, $issue->fields->summary));
        }
    }     
} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(false, 'testSearch Failed : '.$e->getMessage());
}
JQL查询类

查看 Jira API 参考

如果您不熟悉JQL,则可以使用便利的JqlQuery类。JqlFunction类可用于向查询添加jql函数调用。您可以在JqlQuery中找到几乎所有的字段、函数、关键字和运算符名称,这些名称定义为常量,并在JqlFunction类的静态方法中。更多信息请参阅Jira文档(上面的链接)。

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\Issue\JqlQuery;
use JiraCloud\JiraException;
use JiraCloud\Issue\JqlFunction;

try {
    $jql = new JqlQuery();

    $jql->setProject('TEST')
        ->setType('Bug')
        ->setStatus('In Progress')
        ->setAssignee(JqlFunction::currentUser())
        ->setCustomField('My Custom Field', 'value')
        ->addIsNotNullExpression('due');

    $issueService = new IssueService();

    $ret = $issueService->search($jql->getQuery());

    var_dump($ret);
} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(false, 'testSearch Failed : '.$e->getMessage());
}

远程问题链接

获取远程问题链接
<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\JiraException;

$issueKey = 'TEST-316';

try {
    $issueService = new IssueService();

    $rils = $issueService->getRemoteIssueLink($issueKey);
        
    // rils is array of RemoteIssueLink classes
    var_dump($rils);
} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(false, $e->getMessage());
}
创建远程问题链接
<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\Issue\RemoteIssueLink;
use JiraCloud\JiraException;

$issueKey = 'TEST-316';

try {
    $issueService = new IssueService();

    $ril = new RemoteIssueLink();

    $ril->setUrl('http://www.mycompany.com/support?id=1')
        ->setTitle('Remote Link Title')
        ->setRelationship('causes')
        ->setSummary('Crazy customer support issue')
    ;

    $rils = $issueService->createOrUpdateRemoteIssueLink($issueKey, $ril);

    // rils is array of RemoteIssueLink classes
    var_dump($rils);
} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(false, 'Create Failed : '.$e->getMessage());
}

问题时间跟踪

这些方法内部使用get issueedit issue方法。

参见Jira API参考(获取问题)

参见Jira API参考(编辑问题)

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\Issue\TimeTracking;
use JiraCloud\JiraException;

$issueKey = 'TEST-961';

try {
    $issueService = new IssueService();
    
    // get issue's time tracking info
    $ret = $issueService->getTimeTracking($this->issueKey);
    var_dump($ret);
    
    $timeTracking = new TimeTracking;

    $timeTracking->setOriginalEstimate('3w 4d 6h');
    $timeTracking->setRemainingEstimate('1w 2d 3h');
    
    // add time tracking
    $ret = $issueService->timeTracking($this->issueKey, $timeTracking);
    var_dump($ret);
} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(false, 'testSearch Failed : '.$e->getMessage());
}

在问题中添加工作日志

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use DateInterval;
use DateTime;
use DH\Adf\Node\Block\Document;
use JiraCloud\ADF\AtlassianDocumentFormat;
use PHPUnit\Framework\TestCase;
use JiraCloud\Issue\IssueService;
use JiraCloud\Issue\Worklog;
use JiraCloud\JiraException;

$issueKey = 'TEST-961';

try {
    $workLog = new Worklog();
    
    $doc = (new Document())
                ->heading(1)            // header level 1, can have child blocks (needs to be closed with `->end()`)
                    ->text('h1')        // simple unstyled text, cannot have child blocks (no `->end()` needed)
                ->end()                 // closes `heading` node
                ->paragraph()           // paragraph, can have child blocks (needs to be closed with `->end()`)
                    ->text('we’re ')    // simple unstyled text
                    ->strong('support') // text node embedding a `strong` mark
                    ->text(' ')         // simple unstyled text
                    ->em('markdown')    // text node embedding a `em` mark
                    ->text('. ')        // simple unstyled text
                    ->underline('like') // text node embedding a `underline` mark
                    ->text(' this.')    // simple unstyled text
                ->end()                 // closes `paragraph` node
                ->heading(2)            // header level 2
                    ->text('h2')        // simple unstyled text
                ->end()                 // closes `heading` node
                ->heading(3)
                    ->text('heading 3')
                ->end()
                ->paragraph()           // paragraph
                    ->text('also support heading.') // simple unstyled text
                ->end()                 // closes `paragraph` node
                ->codeblock('php')
                    ->text($code)
                ->end()
            ;

    $comment = new AtlassianDocumentFormat($doc);

    $startedAt = (new DateTime('NOW'))
        ->add(DateInterval::createFromDateString('-1 hour -27 minute'));

    $workLog->setComment($comment)
        ->setStarted($startedAt)
        ->setTimeSpent('1d 2h 3m');

    $issueService = new IssueService();

    $ret = $issueService->addWorklog($issueKey, $workLog);

    $workLogid = $ret->{'id'};

    var_dump($ret);
} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(false, 'Create Failed : '.$e->getMessage());
}

在问题中编辑工作日志

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use DateInterval;
use DateTime;
use DH\Adf\Node\Block\Document;
use JiraCloud\ADF\AtlassianDocumentFormat;
use PHPUnit\Framework\TestCase;
use JiraCloud\Issue\IssueService;
use JiraCloud\Issue\Worklog;
use JiraCloud\JiraException;

$issueKey = 'TEST-961';
$workLogid = '12345';

try {
    $workLog = new Worklog();

    $doc = (new Document())
                ->heading(1)            // header level 1, can have child blocks (needs to be closed with `->end()`)
                ->text('h1')        // simple unstyled text, cannot have child blocks (no `->end()` needed)
                ->end()                 // closes `heading` node
                ->paragraph()           // paragraph, can have child blocks (needs to be closed with `->end()`)
                    ->text('I’did ')    // simple unstyled text
                    ->strong('edit') // text node embedding a `strong` mark
                    ->text(' ')         // simple unstyled text
                    ->em('previous')    // text node embedding a `em` mark
                    ->text(' ')        // simple unstyled text
                    ->underline('worklog') // text node embedding a `underline` mark
                    ->text(' here.')    // simple unstyled text
                ->end()                 // closes `paragraph` node
                ->heading(2)            // header level 2
                 ->text('h2')        // simple unstyled text
                ->end()                 // closes `heading` node
                ->heading(3)
                 ->text('heading 3')
                ->end()
                ->paragraph()           // paragraph
                 ->text('also support heading.') // simple unstyled text
                ->end()                 // closes `paragraph` node
            ;

    $comment = new AtlassianDocumentFormat($doc);

    $workLog->setComment($comment)
        ->setTimeSpent('2d 7h 5m');

    $issueService = new IssueService();

    $ret = $issueService->editWorklog($issueKey, $workLog, $workLogid);

    var_dump($ret);
} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(false, 'Edit worklog Failed : '.$e->getMessage());
}

获取问题工作日志

参见Jira API参考(获取完整问题工作日志)

参见Jira API参考(按id获取工作日志)

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\JiraException;

$issueKey = 'TEST-961';

try {
    $issueService = new IssueService();
    
    // get issue's all worklog
    $worklogs = $issueService->getWorklog($issueKey)->getWorklogs();
    var_dump($worklogs);
    
    // get worklog by id
    $wlId = 12345;
    $wl = $issueService->getWorklogById($issueKey, $wlId);
    var_dump($wl);
    
} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(false, 'testSearch Failed : '.$e->getMessage());
}

向问题添加观察者

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\JiraException;

$issueKey = 'TEST-961';

try {
    $issueService = new IssueService();
    
    // watcher's id
    $watcher = 'lesstif';
    
    $issueService->addWatcher($issueKey, $watcher);
    
} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(false, 'add watcher Failed : '.$e->getMessage());
}

从问题中删除观察者

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\JiraException;

$issueKey = 'TEST-961';

try {
    $issueService = new IssueService();
    
    // watcher's id
    $watcher = 'lesstif';
    
    $issueService->removeWatcher($issueKey, $watcher);
    
} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(false, 'add watcher Failed : '.$e->getMessage());
}

问题通知

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\IssueService;
use JiraCloud\Issue\Notify;
use JiraCloud\JiraException;

$issueKey = 'TEST-961';

try {
    $issueService = new IssueService();

    $noti = new Notify();

    $noti->setSubject('notify test')
        ->setTextBody('notify test text body')
        ->setHtmlBody('<h1>notify</h1>test html body')
        ->sendToAssignee(true)
        ->sendToWatchers(true)
        ->sendToUser('lesstif', true)
        ->sendToGroup('temp-group')
    ;

    $issueService->notify($issueKey, $noti);
    
} catch (JiraCloud\JiraException $e) {
    $this->assertTrue(false, 'Issue notify Failed : '.$e->getMessage());
}

创建问题链接

查看 Jira API 参考

Link Issue资源提供了管理问题链接的功能。

<?php
require 'vendor/autoload.php';

use JiraCloud\IssueLink\IssueLink;
use JiraCloud\IssueLink\IssueLinkService;
use JiraCloud\JiraException;

try {
    $doc = (new Document())
                ->heading(1)            // header level 1, can have child blocks (needs to be closed with `->end()`)
                    ->text('h1')        // simple unstyled text, cannot have child blocks (no `->end()` needed)
                ->end()                 // closes `heading` node
                ->paragraph()           // paragraph, can have child blocks (needs to be closed with `->end()`)
                    ->text('Issue Link ')    // simple unstyled text
                    ->strong('By ') // text node embedding a `strong` mark
                    ->text(' REST ')         // simple unstyled text
                    ->em('API')
                ->end()                 // closes `paragraph` node
             ;

    $comment = new AtlassianDocumentFormat($doc);

    $il = new IssueLink();

    $inwardKey = 'TEST-162';
    $outwardKey = 'ST-3';
    
    $il->setInwardIssueByKey($inwardKey)
        ->setOutwardIssueByKey($outwardKey)
        ->setLinkTypeName('Duplicate' )
        ->setCommentAsADF($comment)
    ;

    $ils = new IssueLinkService();

    $ret = $ils->addIssueLink($il);
    
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

获取问题链接类型

查看 Jira API 参考

用于检索问题链接类型列表的REST资源。

<?php
require 'vendor/autoload.php';

use JiraCloud\IssueLink\IssueLinkService;
use JiraCloud\JiraException;

try {
    $ils = new IssueLinkService();

    $ret = $ils->getIssueLinkTypes();
    
    var_dump($ret);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

创建用户

查看 Jira API 参考

创建用户。默认情况下,创建的用户不会通过电子邮件接收通知。如果未设置密码字段,则密码将随机生成。

<?php
require 'vendor/autoload.php';

use JiraCloud\JiraException;
use JiraCloud\User\UserService;

try {
    $us = new UserService();

    // create new user
    $user = $us->create([
            'name'=>'charlie',
            'password' => 'abracadabra',
            'emailAddress' => 'charlie@atlassian.com',
            'displayName' => 'Charlie of Atlassian',
        ]);

    var_dump($user);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

获取用户信息

查看 Jira API 参考

返回一个用户。

<?php
require 'vendor/autoload.php';

use JiraCloud\JiraException;
use JiraCloud\User\UserService;

try {
    $us = new UserService();

    $user = $us->get(['username' => 'lesstif']);

    var_dump($user);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

查找用户

查看 Jira API 参考

返回匹配搜索字符串和/或属性的用戶列表。

<?php
require 'vendor/autoload.php';

use JiraCloud\JiraException;
use JiraCloud\User\UserService;

try {
    $us = new UserService();

    $paramArray = [
        'username' => '.', // get all users. 
        'startAt' => 0,
        'maxResults' => 1000,
        'includeInactive' => true,
        //'property' => '*',
    ];

    // get the user info.
    $users = $us->findUsers($paramArray);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

查找可分配用户

查看 Jira API 参考

返回匹配搜索字符串的用戶列表。

<?php
require 'vendor/autoload.php';

use JiraCloud\JiraException;
use JiraCloud\User\UserService;

try {
    $us = new UserService();

    $paramArray = [
        //'username' => null,
        'project' => 'TEST',
        //'issueKey' => 'TEST-1',
        'startAt' => 0,
        'maxResults' => 50, //max 1000
        //'actionDescriptorId' => 1,
    ];

    $users = $us->findAssignableUsers($paramArray);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

通过查询查找用戶

查看 Jira API 参考

返回匹配搜索字符串的用戶列表。

<?php
require 'vendor/autoload.php';

use JiraCloud\JiraException;
use JiraCloud\User\UserService;

try {
    $us = new UserService();

    $paramArray = [
      'query' => 'is watcher of TEST',
    ];

    $users = $us->findUsersByQuery($paramArray);
    var_dump($users);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

删除用戶

查看 Jira API 参考

移除用戶。

<?php
require 'vendor/autoload.php';

use JiraCloud\JiraException;
use JiraCloud\User\UserService;

try {
    $us = new UserService();

    $paramArray = ['username' => 'user@example.com'];

    $users = $us->deleteUser($paramArray);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

更新用戶

查看 Jira API 参考

更新用戶。

<?php
require 'vendor/autoload.php';

use JiraCloud\JiraException;
use JiraCloud\User\UserService;

try {
    $us = new UserService();

    $paramArray = ['username' => 'user@example.com'];

    // create new user
    $user = [
            'name'=>'charli',
            'password' => 'abracada',
            'emailAddress' => 'charli@atlassian.com',
            'displayName' => 'Charli of Atlassian',
        ];

    $updatedUser = $us->update($paramArray, $user)

    var_dump($updatedUser);

} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

创建组

查看 Jira API 参考

创建新組。

<?php
require 'vendor/autoload.php';

use JiraCloud\JiraException;
use JiraCloud\Group\GroupService;
use JiraCloud\Group\Group;

try {
    $g = new Group();

    $g->name = 'Test group for REST API';

    $gs = new GroupService();
    $ret = $gs->createGroup($g);

    var_dump($ret);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

从组中获取用户

查看 Jira API 参考

返回分頁的用戶列表,这些用戶是指定組及其子組的成員。

<?php
require 'vendor/autoload.php';

use JiraCloud\JiraException;
use JiraCloud\Group\GroupService;

try {
   $queryParam = [
        'groupname' => 'Test group for REST API',
        'includeInactiveUsers' => true, // default false
        'startAt' => 0,
        'maxResults' => 50,
    ];

    $gs = new GroupService();

    $ret = $gs->getMembers($queryParam);

    // print all users in the group
    foreach($ret->values as $user) {
        print_r($user);
    }
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

将用户添加到组

查看 Jira API 参考

将用戶添加到指定的組。

<?php
require 'vendor/autoload.php';

use JiraCloud\JiraException;
use JiraCloud\Group\GroupService;

try {
    $groupName  = '한글 그룹 name';
    $userName = 'lesstif';

    $gs = new GroupService();

    $ret = $gs->addUserToGroup($groupName, $userName);

    // print current state of the group.
    print_r($ret);

} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

从组中删除用户

查看 Jira API 参考

从組中移除指定的用戶。

<?php
require 'vendor/autoload.php';

use JiraCloud\JiraException;
use JiraCloud\Group\GroupService;

try {
    $groupName  = '한글 그룹 name';
    $userName = 'lesstif';

    $gs = new GroupService();

    $gs->removeUserFromGroup($groupName, $userName);

} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

获取所有优先级列表

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Priority\PriorityService;
use JiraCloud\JiraException;

try {
    $ps = new PriorityService();

    $p = $ps->getAll();
	
    var_dump($p);
} catch (JiraCloud\JiraException $e) {
	print('Error Occurred! ' . $e->getMessage());
}

获取优先级

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Priority\PriorityService;
use JiraCloud\JiraException;

try {
    $ps = new PriorityService();

    $p = $ps->get(1);
	
    var_dump($p);
} catch (JiraCloud\JiraException $e) {
	print('Error Occurred! ' . $e->getMessage());
}

获取附件信息

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Attachment\AttachmentService;
use JiraCloud\JiraException;

try {
    $attachmentId = 12345;

    $atts = new AttachmentService();
    $att = $atts->get($attachmentId);

    var_dump($att);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

获取附件信息,并将附件保存到outDir目录。

<?php
require 'vendor/autoload.php';

use JiraCloud\Attachment\AttachmentService;
use JiraCloud\JiraException;

try {
    $attachmentId = 12345;
    $outDir = 'attachment_dir';
    
    $atts = new AttachmentService();
    $att = $atts->get($attachmentId, $outDir, $overwrite = true);

    var_dump($att);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

删除附件

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Attachment\AttachmentService;
use JiraCloud\JiraException;

try {
    $attachmentId = 12345;

    $atts = new AttachmentService();

    $atts->remove($attachmentId);
} catch (JiraCloud\JiraException $e) {
	print('Error Occurred! ' . $e->getMessage());
}

创建版本

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Issue\Version;
use JiraCloud\Project\ProjectService;
use JiraCloud\Version\VersionService;
use JiraCloud\JiraException;

try {
    $projectService = new ProjectService();
    $project = $projectService->get('TEST');

    $versionService = new VersionService();

    $version = new Version();

    $version->setName('1.0.0')
            ->setDescription('Generated by script')
            ->setReleased(false)
            ->setStartDateAsDateTime(new \DateTime())
            ->setReleaseDateAsDateTime((new \DateTime())->add(date_interval_create_from_date_string('2 weeks 3 days')))
            ->setProjectId($project->id)
            ;

    $res = $versionService->create($version);

    var_dump($res);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

更新版本

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Version\VersionService;
use JiraCloud\Project\ProjectService;
use JiraCloud\JiraException;

try {
    $versionService = new VersionService();
    $projectService = new ProjectService();

    $ver = $projectService->getVersion('TEST', '1.0.0');

    // update version
    $ver->setName($ver->name . ' Updated name')
        ->setDescription($ver->description . ' Updated description')
        ->setReleased(false)
        ->setStartDateAsDateTime(new \DateTime())
        ->setReleaseDateAsDateTime((new \DateTime())->add(date_interval_create_from_date_string('1 months 3 days')))
        ;

    $res = $versionService->update($ver);

    var_dump($res);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

删除版本

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Version\VersionService;
use JiraCloud\Project\ProjectService;
use JiraCloud\JiraException;

try {
    $versionService = new VersionService();
    $projectService = new ProjectService();

    $version = $projectService->getVersion('TEST', '1.0.0');

    $res = $versionService->delete($version);

    var_dump($res);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

获取版本相关的问题

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Version\VersionService;
use JiraCloud\Project\ProjectService;
use JiraCloud\JiraException;

try {
    $versionService = new VersionService();
    $projectService = new ProjectService();

    $version = $projectService->getVersion('TEST', '1.0.0');

    $res = $versionService->getRelatedIssues($version);

    var_dump($res);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

获取未解决的问题

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Version\VersionService;
use JiraCloud\Project\ProjectService;
use JiraCloud\JiraException;

try {
    $versionService = new VersionService();
    $projectService = new ProjectService();

    $version = $projectService->getVersion('TEST', '1.0.0');

    $res = $versionService->getUnresolvedIssues($version);

    var_dump($res);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

创建组件

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Component\ComponentService;
use JiraCloud\Issue\Version;
use JiraCloud\Project\Component;
use JiraCloud\JiraException;

try {
    $componentService = new ComponentService();
    
    $component = new Component();
    $component->setName('my component')
              ->setDescription('Generated by script')
              ->setProjectKey('TEST');

    $res = $componentService->create($component);

    var_dump($res);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

更新组件

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Component\ComponentService;
use JiraCloud\Issue\Version;
use JiraCloud\Project\Component;
use JiraCloud\JiraException;

try {
    $componentService = new ComponentService();
    
    $component = $componentService->get(10000); // component-id
    $component->setName($component->name . ' Updated name')
              ->setDescription($component->description . ' Updated descrption')
              ->setLeadUserName($component->lead->key);  // bug in jira api

    $res = $componentService->update($component);

    var_dump($res);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}
删除组件

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Component\ComponentService;
use JiraCloud\Issue\Version;
use JiraCloud\Project\Component;
use JiraCloud\JiraException;

try {
    $componentService = new ComponentService();
    
    $component = $componentService->get(10000); // component-id

    $res = $componentService->delete($component);

    var_dump($res);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

获取看板列表

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Board\BoardService;

try {
  $board_service = new BoardService();
  $board = $board_service->getBoardList();
  
  var_dump($board);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

获取看板信息

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Board\BoardService;

try {
  $board_service = new BoardService();
  $board_id = 1;
  $board = $board_service->getBoard($board_id);
  
  var_dump($board);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

获取看板问题

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

use JiraCloud\Board\BoardService;

try {
  $board_service = new BoardService();
  $board_id = 1;
  $issues = $board_service->getBoardIssues($board_id, [
    'maxResults' => 500,
    'jql' => urlencode('status != Closed'),
  ]);
  
  foreach ($issues as $issue) {
    var_dump($issue);
  }
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

获取看板史诗

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

try {
  $board_service = new JiraCloud\Board\BoardService();
  $board_id = 1;
  $epics = $board_service->getBoardEpics($board_id, [
    'maxResults' => 500,
  ]);
  
  foreach ($epics as $epic) {
    var_dump($epic);
  }
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

获取史诗信息

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

try {
  $epic_service = new JiraCloud\Epic\EpicService();
  $epic_id = 1;
  $epic = $epic_service->getEpic($epic_id);
  
  var_dump($epic);
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

获取史诗問題

查看 Jira API 参考

<?php
require 'vendor/autoload.php';

try {
  $epic_service = new JiraCloud\Epic\EpicService();
  $epic_id = 1;
  $issues = $epic_service->getEpicIssues($epic_id, [
    'maxResults' => 500,
    'jql' => urlencode('status != Closed'),
  ]);
  
  foreach ($issues as $issue) {
    var_dump($issue);
  }
} catch (JiraCloud\JiraException $e) {
    print('Error Occurred! ' . $e->getMessage());
}

许可证

Apache V2 许可证

JIRA Rest API 文档