lesstif / php-jira-rest-client
JIRA REST API Client for PHP Users.
Requires
- php: ^8.0
- ext-curl: *
- ext-json: *
- monolog/monolog: ^2.0|^3.0
- netresearch/jsonmapper: ^4.2|^5.0
- vlucas/phpdotenv: ^5.0|^6.0
Requires (Dev)
- mockery/mockery: ^1.0|^2.0
- phpstan/phpstan: ^1.0|^2.0
- phpunit/phpunit: ^9.0|^10.0
- symfony/var-dumper: ^5.0|^6.0|^7.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
- dev-main
- 5.16.0
- 5.15.0
- 5.14.0
- 5.13.0
- 5.12.1
- 5.12.0
- 5.11.1
- 5.11.0
- 5.10.0
- 5.9.0
- 5.8.0
- 5.7.0
- 5.6.0
- 5.5.1
- 5.5.0
- 5.4.0
- 5.3.1
- 5.3.0
- 5.2.0
- 5.1.0
- 5.0.0
- 4.1.0
- 4.0.4
- 4.0.3
- 4.0.2
- 4.0.1
- 4.0.0
- 3.1.1
- 3.1.0
- 3.0.0
- 2.6.0
- 2.5.1
- 2.5.0
- 2.4.1
- 2.4.0
- 2.3.0
- 2.2.2
- 2.2.1
- 2.2.0
- 2.1.0
- 2.0
- 1.45.0
- 1.44.0
- 1.43.0
- 1.42.0
- 1.41.0
- 1.40.0
- 1.39.0
- 1.38.1
- 1.38.0
- 1.37.0
- 1.36.0
- 1.35.1
- 1.35.0
- 1.34.0
- 1.33.1
- 1.33.0
- 1.32.0
- 1.31.0
- 1.30.3
- 1.30.2
- 1.30.1
- 1.30.0
- 1.29.0
- 1.28.0
- 1.27.0
- 1.26.0
- 1.25.0
- 1.24.0
- 1.23.1
- 1.23.0
- 1.22.0
- 1.21.0
- 1.20.3
- 1.20.2
- 1.20.1
- 1.20.0
- 1.19.8
- 1.19.7
- 1.19.6
- 1.19.5
- 1.19.4
- 1.19.3
- 1.19.2
- 1.19.1
- 1.19.0
- 1.18.1
- 1.18.0
- 1.17.0
- 1.16.0
- 1.15.0
- 1.14.4
- 1.14.3
- 1.14.2
- 1.14.1
- 1.14
- 1.13.4
- 1.13.3
- 1.13.2
- 1.13.1
- 1.13.0
- 1.12.2
- 1.12.1
- 1.12.0
- 1.11.0
- 1.10.7
- 1.10.6
- 1.10.5
- 1.10.4
- 1.10.3
- 1.10.2
- 1.10.1
- 1.10.0
- 1.9.4
- 1.9.3
- 1.9.2
- 1.9.1
- 1.9.0
- 1.8.3
- 1.8.2
- 1.8.1
- 1.8.0
- 1.7.4
- 1.7.3
- 1.7.2
- 1.7.1
- 1.7.0
- 1.6.3
- 1.6.2
- 1.6.1
- 1.6.0
- 1.5.2
- 1.5.1
- 1.5.0
- 1.4.1
- 1.4.0
- 1.3.2
- 1.3.1
- 1.3.0
- 1.2.2
- 1.2.1
- 1.2.0
- 1.1.6
- 1.1.5
- 1.1.3
- 1.1.2
- 1.1.1
- 1.1
- 1.0
- 0.9
- 0.8
- 0.7
- 0.6.1
- 0.6
- 0.5.1
- 0.5
- dev-analysis-0peQbw
- dev-fix/search-datacenter-fallback
- dev-analysis-REPB4Y
- dev-analysis-g6jWPw
- dev-analysis-W6kVEN
- dev-analysis-LZYpZl
- dev-analysis-vZ2OnN
- dev-analysis-O3mPBk
- dev-analysis-neMOPN
- dev-analysis-KoB7GQ
- dev-analysis-Q3EgY3
- dev-analysis-kYldNy
- dev-analysis-lZ07lV
- dev-analysis-lZr9AO
- dev-analysis-rrrAY9
- dev-analysis-PGxejP
- dev-analysis-MP1eR4
- dev-analysis-VBvR1B
- dev-analysis-rr40x9
- dev-revert-422-main
- dev-develop
- dev-analysis-1bmO5v
- dev-3.0.0-alpha
- dev-feature/phpstan-level2
- dev-for-php-5.4
This package is auto-updated.
Last update: 2026-10-25 14:38:36 UTC
README
On-Premise only
If you want to interact with Jira cloud instead of On-Premise(Server, Data Center), check out this repository.
From version >= 5.0.0 of this repository this project is only using V2 of the Jira rest API, to use V3 check out this repository.
Requirements
- PHP >= 8.0
- php JsonMapper
- phpdotenv
Installation
-
Download and Install PHP Composer.
curl -sS https://getcomposer.org/installer | php -
Next, run the Composer command to install the latest version of php jira rest client.
php composer.phar require lesstif/php-jira-rest-client
or add the following to your composer.json file.
{ "require": { "lesstif/php-jira-rest-client": "^5.0" } } -
Then run Composer's install or update commands to complete installation.
php composer.phar install
-
After installing, you need to require Composer's autoloader:
require 'vendor/autoload.php';
Laravel: Once installed, if you are not using automatic package discovery, then you need to register the JiraRestApi\JiraRestApiServiceProvider service provider in your config/app.php.
Configuration
you can choose loads environment variables either 'dotenv' or 'array'.
use dotenv
If you want to use Dotenv based configuration,first of all, you have to install dependency.
composer require vlucas/phpdotenv
then copy .env.example file to .env on your project root.
JIRA_HOST='https://your-jira.host.com' JIRA_USER='jira-username' JIRA_PASS='jira-password-OR-api-token' # log settings. JIRA_LOG_FILE is relative to the current working directory (default: jira-rest-client.log) JIRA_LOG_ENABLED=true JIRA_LOG_FILE='jira-rest-client.log' JIRA_LOG_LEVEL='WARNING' # if TOKEN_BASED_AUTH set to true, ignore JIRA_USER and JIRA_PASS. TOKEN_BASED_AUTH=true PERSONAL_ACCESS_TOKEN='your-access-token-here' # OAuth 2.0 access token. if set, it is used instead of PERSONAL_ACCESS_TOKEN and JIRA_USER/JIRA_PASS. # OAUTH_ACCESS_TOKEN='your-oauth-access-token' # to enable session cookie authorization # COOKIE_AUTH_ENABLED=true # COOKIE_FILE=storage/jira-cookie.txt # if you are behind a proxy, add proxy settings PROXY_SERVER='your-proxy-server' PROXY_PORT='proxy-port' PROXY_USER='proxy-username' PROXY_PASSWORD='proxy-password'
Important Note: As of March 15, 2018, in accordance to the Atlassian REST API Policy, Basic auth with password to be deprecated. Instead of password, you should using API token.
Laravel Users: If you are developing with laravel framework(5.x), you must append above configuration to your application .env file.
The default log file jira-rest-client.log is created in the current working directory, which is the public directory for web requests.
Since it is usually not writable (and shouldn't be public), set JIRA_LOG_FILE to the absolute path of the storage directory,
or disable logging with JIRA_LOG_ENABLED=false.
JIRA_LOG_FILE=/path/to/your-laravel-app/storage/logs/jira-rest-client.log
OAuth 2.0
If OAUTH_ACCESS_TOKEN (or oauthAccessToken in the array configuration) is set, it is sent as Authorization: Bearer {token}
and takes precedence over the personal access token and basic authentication.
- Jira Data Center 8.22 or later: create an incoming application link (OAuth 2.0).
JIRA_HOSTstays the same. - Jira Cloud: create an OAuth 2.0 (3LO) app
and set
JIRA_HOSTtohttps://api.atlassian.com/ex/jira/{cloudId}.
This library only sends the access token. Getting the token (the authorization code flow) and refreshing it is up to your application. OAuth 1.0a is not supported.
use array
create Service class with ArrayConfiguration parameter.
use JiraRestApi\Configuration\ArrayConfiguration; use JiraRestApi\Issue\IssueService; $iss = new IssueService(new ArrayConfiguration( [ 'jiraHost' => 'https://your-jira.host.com', // Basic authentication deprecated /* 'jiraUser' => 'jira-username', 'jiraPassword' => 'jira-password-OR-api-token', */ // instead,you can use the token based authentication. 'useTokenBasedAuth' => true, 'personalAccessToken' => 'your-token-here', // or OAuth 2.0 access token (takes precedence over the personal access token) // 'oauthAccessToken' => 'your-oauth-access-token', // 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', ] ));
Usage
Table of Contents
Project
- Create Project
- Update Project
- Delete Project
- Get Project Info
- Get All Project list
- Get Project Components
- Get Project Type
- Get Project Version
Custom Field
Issue
- Get Issue Info
- Render wiki markup to HTML
- Create Issue
- Create Issue - bulk
- Create Sub Task
- Add Attachment
- Update issue
- Change assignee
- Remove issue
- Perform a transition on an issue
- Perform an advanced search, using the JQL
- Remote Issue Link
- Issue time tracking
- Add worklog in Issue
- Edit worklog in Issue
- Get Issue worklog
- Add watcher to Issue
- Remove watcher from Issue
- Send a notification to the recipients
- Read property
- Write property
Comment
IssueLink
User
- Create User
- Get User Info
- Find Users
- Find Assignable Users
- Find Users by query
- Delete User
- Update User
- User Properties
Group
Priority
Attachment
Version
- Create version
- Update version
- Delete version
- Get version related issues
- Get version unresolved issues
Component
Board
Epic
Create Project
Create a new project.
<?php require 'vendor/autoload.php'; use JiraRestApi\Project\ProjectService; use JiraRestApi\Project\Project; use JiraRestApi\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 (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Update Project
Update a project. Only non null values sent in JSON will be updated in the project.
Values available for the assigneeType field are: 'PROJECT_LEAD' and 'UNASSIGNED'.
<?php require 'vendor/autoload.php'; use JiraRestApi\Project\ProjectService; use JiraRestApi\Project\Project; use JiraRestApi\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 (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Delete Project
Deletes a project.
<?php require 'vendor/autoload.php'; use JiraRestApi\Project\ProjectService; use JiraRestApi\JiraException; try { $proj = new ProjectService(); $pj = $proj->deleteProject('EX'); var_dump($pj); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Get Project Info
<?php require 'vendor/autoload.php'; use JiraRestApi\Project\ProjectService; use JiraRestApi\JiraException; try { $proj = new ProjectService(); $p = $proj->get('TEST'); var_dump($p); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Get All Project list
<?php require 'vendor/autoload.php'; use JiraRestApi\Project\ProjectService; use JiraRestApi\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 (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Get Project Components
See Jira API reference (Get project components)
<?php require 'vendor/autoload.php'; use JiraRestApi\Project\ProjectService; use JiraRestApi\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 (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Get Project type
See Jira API reference (get all types)
See Jira API reference (get type)
<?php require 'vendor/autoload.php'; use JiraRestApi\Project\ProjectService; use JiraRestApi\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 (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Get Project Version
get all project's versions.
<?php require 'vendor/autoload.php'; use JiraRestApi\Project\ProjectService; use JiraRestApi\JiraException; try { $proj = new ProjectService(); $vers = $proj->getVersions('TEST'); foreach ($vers as $v) { // $v is JiraRestApi\Issue\Version var_dump($v); } } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
or get pagenated project's versions.
<?php require 'vendor/autoload.php'; use JiraRestApi\Project\ProjectService; use JiraRestApi\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 JiraRestApi\Issue\Version var_dump($v); } } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Get All Field List
<?php require 'vendor/autoload.php'; use JiraRestApi\Field\Field; use JiraRestApi\Field\FieldService; use JiraRestApi\JiraException; try { $fieldService = new FieldService(); // return custom field only. $ret = $fieldService->getAllFields(Field::CUSTOM); var_dump($ret); } catch (JiraRestApi\JiraException $e) { $this->assertTrue(false, 'testSearch Failed : '.$e->getMessage()); }
Create Custom Field
<?php require 'vendor/autoload.php'; use JiraRestApi\Field\Field; use JiraRestApi\Field\FieldService; use JiraRestApi\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 (JiraRestApi\JiraException $e) { $this->assertTrue(false, 'Field Create Failed : '.$e->getMessage()); }
If you need a list of custom field types(ex. com.atlassian.jira.plugin.system.customfieldtypes:grouppicker) , check out Get All Field list.
Get Issue Info
Returns a full representation of the issue for the given issue key.
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\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 (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
You can access the custom field associated with issue through $issue->fields->customFields array or through direct custom field id variables(Ex: $issue->fields->customfield_10300).
Render wiki markup to HTML
To get the HTML of an existing issue's fields, get the issue with 'expand' => ['renderedFields'] (see above) and use $issue->renderedFields.
To render arbitrary wiki markup, use renderWikiMarkup().
It calls /rest/api/1.0/render, which Jira's own editor preview uses. It is not a documented public API, so it may change in future Jira versions.
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\JiraException; try { $issueService = new IssueService(); // '<p><b>bold</b> <a href="https://example.com" ...>link</a></p>' $html = $issueService->renderWikiMarkup('*bold* [link|https://example.com]'); // with an issue key, issue links and attachments are rendered in the context of the issue. $html = $issueService->renderWikiMarkup('see TEST-1 and !screenshot.png!', 'TEST-1'); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Create Issue
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\Issue\IssueField; use JiraRestApi\JiraException; 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') ->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 (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
If you want to set custom field, you can call the addCustomField function with custom field id and value as parameters.
try { $issueField = new IssueField(); $issueField->setProjectKey('TEST') ->setSummary('something\'s wrong') ->setAssigneeNameAsString('lesstif') ->setPriorityNameAsString('Critical') ->setIssueTypeAsString('Bug') ->setDescription('Full description for issue') ->addVersion('1.0.1') ->addVersion('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 (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Currently, not tested for all custom field types.
Create Multiple Issues
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\Issue\IssueField; use JiraRestApi\JiraException; try { $issueFieldOne = new IssueField(); $issueFieldOne->setProjectKey('TEST') ->setSummary('something\'s wrong') ->setPriorityNameAsString('Critical') ->setIssueTypeAsString('Bug') ->setDescription('Full description for issue'); $issueFieldTwo = new IssueField(); $issueFieldTwo->setProjectKey('TEST') ->setSummary('something else is wrong') ->setPriorityNameAsString('Critical') ->setIssueTypeAsString('Bug') ->setDescription('Full description for second issue'); $issueService = new IssueService(); $ret = $issueService->createMultiple([$issueFieldOne, $issueFieldTwo]); //If success, returns an array of the created issues var_dump($ret); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Create Sub Task
Creating a sub-task is similar to creating a regular issue, with two important method calls:
->setIssueTypeAsString('Sub-task') ->setParentKeyOrId($issueKeyOrId)
for example
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\Issue\IssueField; use JiraRestApi\JiraException; try { $issueField = new IssueField(); $issueField->setProjectKey('TEST') ->setSummary('something\'s wrong') ->setAssigneeNameAsString('lesstif') ->setPriorityNameAsString('Critical') ->setDescription('Full description for issue') ->addVersion('1.0.1') ->addVersion('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 (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
If you want to set custom field, you can call the addCustomField function with custom field id and value as parameters.
try { $issueField = new IssueField(); $issueField->setProjectKey('TEST') ->setSummary('something\'s wrong') ->setAssigneeNameAsString('lesstif') ->setPriorityNameAsString('Critical') ->setIssueTypeAsString('Bug') ->setDescription('Full description for issue') ->addVersion('1.0.1') ->addVersion('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 (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Currently, not tested for all custom field types.
Add Attachment
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\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 (JiraRestApi\JiraException $e) { $this->assertTrue(FALSE, 'Attach Failed : ' . $e->getMessage()); }
Update issue
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\Issue\IssueField; use JiraRestApi\JiraException; $issueKey = 'TEST-879'; try { $issueField = new IssueField(true); $issueField->setAssigneeNameAsString('admin') ->setPriorityNameAsString('Blocker') ->setIssueTypeAsString('Task') ->addLabel('test-label-first') ->addLabel('test-label-second') ->addVersion('1.0.1') ->addVersion('1.0.2') ->setDescription('This is a shorthand for a set operation on the summary field') ; // 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 (JiraRestApi\JiraException $e) { $this->assertTrue(FALSE, 'update Failed : ' . $e->getMessage()); }
If you want to change the custom field type when updating an issue, you can call the addCustomField function just as you did for creating issue.
Update labels
This function is a convenient wrapper for add or remove label in the issue.
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\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 (JiraRestApi\JiraException $e) { $this->assertTrue(false, 'updateLabels Failed : '.$e->getMessage()); }
Update fix versions
This function is a convenient wrapper for add or remove fix version in the issue.
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\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 (JiraRestApi\JiraException $e) { $this->assertTrue(false, 'updateFixVersions Failed : '.$e->getMessage()); }
Change Assignee
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\JiraException; $issueKey = 'TEST-879'; try { $issueService = new IssueService(); // if assignee is -1, automatic assignee used. // A null assignee will remove the assignee. $assignee = 'newAssigneeName'; $ret = $issueService->changeAssignee($issueKey, $assignee); var_dump($ret); } catch (JiraRestApi\JiraException $e) { $this->assertTrue(FALSE, 'Change Assignee Failed : ' . $e->getMessage()); }
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\JiraException; $issueKey = 'TEST-879'; try { $issueService = new IssueService(); $accountId = 'usre-account-id'; $ret = $issueService->changeAssigneeByAccountId($issueKey, $accountId); var_dump($ret); } catch (JiraRestApi\JiraException $e) { $this->assertTrue(FALSE, 'Change Assignee Failed : ' . $e->getMessage()); }
Remove Issue
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\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 (JiraRestApi\JiraException $e) { $this->assertTrue(FALSE, 'Remove Issue Failed : ' . $e->getMessage()); }
Read property
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\JiraException; $issueKey = "TEST-879"; try { $issueService = new IssueService(); $property = $issueService->getProperty($issueKey, 'com.railsware.SmartChecklist.checklist'); var_dump($property); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Write property
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\Issue\Property; use JiraRestApi\JiraException; $issueKey = "TEST-879"; try { $issueService = new IssueService(); $property = new Property(); $property->value = "- First entry\n- second entry"; $issueService->setProperty($issueKey, $property); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Add comment
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\Issue\Comment; use JiraRestApi\JiraException; $issueKey = 'TEST-879'; try { $comment = new Comment(); $body = <<<COMMENT Adds a new comment to an issue. * Bullet 1 * Bullet 2 ** sub Bullet 1 ** sub Bullet 2 * Bullet 3 COMMENT; $comment->setBody($body) ->setVisibilityAsString('role', 'Users'); ; $issueService = new IssueService(); $ret = $issueService->addComment($issueKey, $comment); print_r($ret); } catch (JiraRestApi\JiraException $e) { $this->assertTrue(FALSE, 'add Comment Failed : ' . $e->getMessage()); }
Get comment
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\JiraException; $issueKey = 'TEST-879'; try { $issueService = new IssueService(); $param = [ 'startAt' => 0, 'maxResults' => 3, 'expand' => 'renderedBody', ]; $comments = $issueService->getComments($issueKey, $param); var_dump($comments); } catch (JiraRestApi\JiraException $e) { $this->assertTrue(false, 'get Comment Failed : '.$e->getMessage()); }
get comment by comment id
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\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 (JiraRestApi\JiraException $e) { $this->assertTrue(false, 'get Comment Failed : '.$e->getMessage()); }
Delete comment
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\JiraException; $issueKey = 'TEST-879'; try { $commentId = 12345; $issueService = new IssueService(); $ret = $issueService->deleteComment($issueKey, $commentId); } catch (JiraRestApi\JiraException $e) { $this->assertTrue(false, 'Delete comment Failed : '.$e->getMessage()); }
Update comment
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\JiraException; use JiraRestApi\Issue\Comment; $issueKey = 'TEST-879'; try { $commentId = 12345; $issueService = new IssueService(); $comment = new Comment(); $comment->setBody('Updated comments'); $issueService->updateComment($issueKey, $commentId, $comment); } catch (JiraRestApi\JiraException $e) { $this->assertTrue(false, 'Update comment Failed : '.$e->getMessage()); }
Perform a transition on an issue
Note: this library uses goal status names instead of transition names.
So, if you want to change issue status to 'Some Status',
you should pass that status name to setTransitionName
i.e. $transition->setTransitionName('Some Status')
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\Issue\Transition; use JiraRestApi\JiraException; $issueKey = 'TEST-879'; try { $transition = new Transition(); $transition->setTransitionName('Resolved'); $transition->setCommentBody('performing the transition via REST API.'); $issueService = new IssueService(); $issueService->transition($issueKey, $transition); } catch (JiraRestApi\JiraException $e) { $this->assertTrue(FALSE, 'add Comment Failed : ' . $e->getMessage()); }
Note: If you are JIRA with local language profiles, you must use setUntranslatedName instead of setTransitionName.
i.e. $transition->setUntranslatedName('Done')
Perform an advanced search
Simple Query
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\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 (JiraRestApi\JiraException $e) { $this->assertTrue(false, 'testSearch Failed : '.$e->getMessage()); }
Simple Query with LinkedIssue
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\JiraException; use JiraRestApi\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 Occured! ' . $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 Occured! ' . $e->getMessage()); }
JQL with pagination
Jira Cloud removed the offset based /rest/api/2/search API and uses nextPageToken for paging (CHANGE-2046).
Jira Server/Data Center doesn't provide the new API, so search() automatically falls back to the legacy /search API
and returns the next startAt offset as nextPageToken. The same code works on both.
The fallback is remembered per Jira host, so later searches call /search directly.
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\JiraException; $jql = 'project not in (TEST) and assignee = currentUser() and status in (Resolved, closed)'; try { $issueService = new IssueService(); $nextPageToken = ''; $maxResult = 3; // the maximum number of issues to return per page (defaults to 50). do { $ret = $issueService->search($jql, $nextPageToken, $maxResult, ['summary']); foreach ($ret->issues as $issue) { print (sprintf("%s %s \n", $issue->key, $issue->fields->summary)); } $nextPageToken = $ret->getNextPageToken(); } while (!empty($nextPageToken)); } catch (JiraRestApi\JiraException $e) { $this->assertTrue(false, 'testSearch Failed : '.$e->getMessage()); }
If you need the number of matched issues on Jira Cloud, use searchApproximateCount().
$count = $issueService->searchApproximateCount($jql); print ($count->count);
JQL query class
If you're not familiar JQL then you can use convenience JqlQuery class.
JqlFunction class can be used to add jql functions calls to query.
You can find the names of almost all fields, functions, keywords and operators
defined as constants in JqlQuery and static methods in JqlFunciton classes.
For more info see the Jira docs (link above).
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\Issue\JqlQuery; use JiraRestApi\JiraException; use JiraRestApi\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 (JiraRestApi\JiraException $e) { $this->assertTrue(false, 'testSearch Failed : '.$e->getMessage()); }
setCustomField() uses = by default. Some fields don't support it (e.g. text fields only support ~),
so you can pass the operator as the 4th parameter.
Tempo on Forge changed its JQL syntax (details):
Account and Tempo Team need the .name suffix, and fields referenced by id (cf[10000]) only support ~.
$jql = new JqlQuery(); $jql->setProject('TEST') // "Account.name" = "Maintenance" ->setCustomField('Account.name', 'Maintenance') // "Tempo Team.name" != "Palavin" ->setCustomField('Tempo Team.name', 'Palavin', JqlQuery::KEYWORD_AND, JqlQuery::OPERATOR_NOT_EQUALS) // "cf[10000]" ~ "Maintenance" ->setCustomField('cf[10000]', 'Maintenance', JqlQuery::KEYWORD_AND, JqlQuery::OPERATOR_CONTAINS);
Remote Issue Link
get remote issue link
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\JiraException; $issueKey = 'TEST-316'; try { $issueService = new IssueService(); $rils = $issueService->getRemoteIssueLink($issueKey); // rils is array of RemoteIssueLink classes var_dump($rils); } catch (JiraRestApi\JiraException $e) { $this->assertTrue(false, $e->getMessage()); }
create remote issue link
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\Issue\RemoteIssueLink; use JiraRestApi\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 (JiraRestApi\JiraException $e) { $this->assertTrue(false, 'Create Failed : '.$e->getMessage()); }
Issue time tracking
This methods use get issue and edit issue methods internally.
See Jira API reference (get issue)
See Jira API reference (edit issue)
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\Issue\TimeTracking; use JiraRestApi\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 (JiraRestApi\JiraException $e) { $this->assertTrue(false, 'testSearch Failed : '.$e->getMessage()); }
Add worklog in issue
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\Issue\Worklog; use JiraRestApi\JiraException; $issueKey = 'TEST-961'; try { $workLog = new Worklog(); $workLog->setComment('I did some work here.') ->setStarted('2016-05-28 12:35:54') ->setTimeSpent('1d 2h 3m'); $issueService = new IssueService(); $ret = $issueService->addWorklog($issueKey, $workLog); $workLogid = $ret->{'id'}; var_dump($ret); } catch (JiraRestApi\JiraException $e) { $this->assertTrue(false, 'Create Failed : '.$e->getMessage()); }
edit worklog in issue
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\Issue\Worklog; use JiraRestApi\JiraException; $issueKey = 'TEST-961'; $workLogid = '12345'; try { $workLog = new Worklog(); $workLog->setComment('I did edit previous worklog here.') ->setStarted('2016-05-29 13:15:34') ->setTimeSpent('3d 4h 5m'); $issueService = new IssueService(); $ret = $issueService->editWorklog($issueKey, $workLog, $workLogid); var_dump($ret); } catch (JiraRestApi\JiraException $e) { $this->assertTrue(false, 'Edit worklog Failed : '.$e->getMessage()); }
Get issue worklog
See Jira API reference (get full issue worklog)
See Jira API reference (get worklog by id)
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\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 (JiraRestApi\JiraException $e) { $this->assertTrue(false, 'testSearch Failed : '.$e->getMessage()); }
Add watcher to Issue
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\JiraException; $issueKey = 'TEST-961'; try { $issueService = new IssueService(); // watcher's id $watcher = 'lesstif'; $issueService->addWatcher($issueKey, $watcher); } catch (JiraRestApi\JiraException $e) { $this->assertTrue(false, 'add watcher Failed : '.$e->getMessage()); }
Remove watcher from Issue
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\JiraException; $issueKey = 'TEST-961'; try { $issueService = new IssueService(); // watcher's id $watcher = 'lesstif'; $issueService->removeWatcher($issueKey, $watcher); } catch (JiraRestApi\JiraException $e) { $this->assertTrue(false, 'add watcher Failed : '.$e->getMessage()); }
issue notify
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\IssueService; use JiraRestApi\Issue\Notify; use JiraRestApi\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 (JiraRestApi\JiraException $e) { $this->assertTrue(false, 'Issue notify Failed : '.$e->getMessage()); }
Create Issue Link
The Link Issue Resource provides functionality to manage issue links.
<?php require 'vendor/autoload.php'; use JiraRestApi\IssueLink\IssueLink; use JiraRestApi\IssueLink\IssueLinkService; use JiraRestApi\JiraException; try { $il = new IssueLink(); $il->setInwardIssue('TEST-258') ->setOutwardIssue('TEST-249') ->setLinkTypeName('Relates' ) ->setComment('Linked related issue via REST API.'); $ils = new IssueLinkService(); $ret = $ils->addIssueLink($il); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Get Issue LinkType
Rest resource to retrieve a list of issue link types.
<?php require 'vendor/autoload.php'; use JiraRestApi\IssueLink\IssueLinkService; use JiraRestApi\JiraException; try { $ils = new IssueLinkService(); $ret = $ils->getIssueLinkTypes(); var_dump($ret); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Create User
Create user. By default created user will not be notified with email. If password field is not set then password will be randomly generated.
<?php require 'vendor/autoload.php'; use JiraRestApi\JiraException; use JiraRestApi\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 (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Get User Info
Returns a user.
<?php require 'vendor/autoload.php'; use JiraRestApi\JiraException; use JiraRestApi\User\UserService; try { $us = new UserService(); $user = $us->get(['username' => 'lesstif']); var_dump($user); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Find Users
Returns a list of users that match the search string and/or property.
<?php require 'vendor/autoload.php'; use JiraRestApi\JiraException; use JiraRestApi\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 (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Find Assignable Users
Returns a list of users that match the search string.
<?php require 'vendor/autoload.php'; use JiraRestApi\JiraException; use JiraRestApi\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 (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Find users by query
Returns a list of users that match the search string.
<?php require 'vendor/autoload.php'; use JiraRestApi\JiraException; use JiraRestApi\User\UserService; try { $us = new UserService(); $paramArray = [ 'query' => 'is watcher of TEST', ]; $users = $us->findUsersByQuery($paramArray); var_dump($users); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
delete User
Removes user.
<?php require 'vendor/autoload.php'; use JiraRestApi\JiraException; use JiraRestApi\User\UserService; try { $us = new UserService(); $paramArray = ['username' => 'user@example.com']; $users = $us->deleteUser($paramArray); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
update User
Updates user.
<?php require 'vendor/autoload.php'; use JiraRestApi\JiraException; use JiraRestApi\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 (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
User Properties
Gets, sets and deletes user properties. The value can be any JSON serializable value.
Identify the user with username or userKey (Jira Server/Data Center), or accountId (Jira Cloud).
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\Property; use JiraRestApi\JiraException; use JiraRestApi\User\UserService; try { $us = new UserService(); $user = ['username' => 'lesstif']; $property = new Property(); $property->key = 'my.settings'; $property->value = ['theme' => 'dark', 'pageSize' => 50]; $us->setProperty($user, $property); // ['my.settings', ...] var_dump($us->getPropertyKeys($user)); // value is decoded JSON: $ret->value->theme === 'dark' $ret = $us->getProperty($user, 'my.settings'); var_dump($ret->value); $us->deleteProperty($user, 'my.settings'); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Create Group
Create new group.
<?php require 'vendor/autoload.php'; use JiraRestApi\JiraException; use JiraRestApi\Group\GroupService; use JiraRestApi\Group\Group; try { $g = new Group(); $g->name = 'Test group for REST API'; $gs = new GroupService(); $ret = $gs->createGroup($g); var_dump($ret); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Get Users from group
returns a paginated list of users who are members of the specified group and its subgroups.
<?php require 'vendor/autoload.php'; use JiraRestApi\JiraException; use JiraRestApi\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 (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Add User to group
add user to given group.
<?php require 'vendor/autoload.php'; use JiraRestApi\JiraException; use JiraRestApi\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 (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Remove User from group
Removes given user from a group.
<?php require 'vendor/autoload.php'; use JiraRestApi\JiraException; use JiraRestApi\Group\GroupService; try { $groupName = '한글 그룹 name'; $userName = 'lesstif'; $gs = new GroupService(); $gs->removeUserFromGroup($groupName, $userName); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Get All Priority list
<?php require 'vendor/autoload.php'; use JiraRestApi\Priority\PriorityService; use JiraRestApi\JiraException; try { $ps = new PriorityService(); $p = $ps->getAll(); var_dump($p); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Get Priority
<?php require 'vendor/autoload.php'; use JiraRestApi\Priority\PriorityService; use JiraRestApi\JiraException; try { $ps = new PriorityService(); $p = $ps->get(1); var_dump($p); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Get Attachment Info
<?php require 'vendor/autoload.php'; use JiraRestApi\Attachment\AttachmentService; use JiraRestApi\JiraException; try { $attachmentId = 12345; $atts = new AttachmentService(); $att = $atts->get($attachmentId); var_dump($att); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Gets the attachment information and saves the attachment into the outDir directory.
<?php require 'vendor/autoload.php'; use JiraRestApi\Attachment\AttachmentService; use JiraRestApi\JiraException; try { $attachmentId = 12345; $outDir = 'attachment_dir'; $atts = new AttachmentService(); $att = $atts->get($attachmentId, $outDir, $overwrite = true); var_dump($att); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Remove attachment
<?php require 'vendor/autoload.php'; use JiraRestApi\Attachment\AttachmentService; use JiraRestApi\JiraException; try { $attachmentId = 12345; $atts = new AttachmentService(); $atts->remove($attachmentId); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Create version
<?php require 'vendor/autoload.php'; use JiraRestApi\Issue\Version; use JiraRestApi\Project\ProjectService; use JiraRestApi\Version\VersionService; use JiraRestApi\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(true) ->setStartDateAsDateTime(new \DateTime()) ->setReleaseDateAsDateTime((new \DateTime())->add(date_interval_create_from_date_string('1 months 3 days'))) ->setProjectId($project->id) ; $res = $versionService->create($version); var_dump($res); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Update version
<?php require 'vendor/autoload.php'; use JiraRestApi\Version\VersionService; use JiraRestApi\Project\ProjectService; use JiraRestApi\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('2 weeks 3 days'))) ; $res = $versionService->update($ver); var_dump($res); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Delete version
<?php require 'vendor/autoload.php'; use JiraRestApi\Version\VersionService; use JiraRestApi\Project\ProjectService; use JiraRestApi\JiraException; try { $versionService = new VersionService(); $projectService = new ProjectService(); $version = $projectService->getVersion('TEST', '1.0.0'); $res = $versionService->delete($version); var_dump($res); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Get version related issues
<?php require 'vendor/autoload.php'; use JiraRestApi\Version\VersionService; use JiraRestApi\Project\ProjectService; use JiraRestApi\JiraException; try { $versionService = new VersionService(); $projectService = new ProjectService(); $version = $projectService->getVersion('TEST', '1.0.0'); $res = $versionService->getRelatedIssues($version); var_dump($res); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Get version unresolved issues
<?php require 'vendor/autoload.php'; use JiraRestApi\Version\VersionService; use JiraRestApi\Project\ProjectService; use JiraRestApi\JiraException; try { $versionService = new VersionService(); $projectService = new ProjectService(); $version = $projectService->getVersion('TEST', '1.0.0'); $res = $versionService->getUnresolvedIssues($version); var_dump($res); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Create component
<?php require 'vendor/autoload.php'; use JiraRestApi\Component\ComponentService; use JiraRestApi\Issue\Version; use JiraRestApi\Project\Component; use JiraRestApi\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 (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Update component
<?php require 'vendor/autoload.php'; use JiraRestApi\Component\ComponentService; use JiraRestApi\Issue\Version; use JiraRestApi\Project\Component; use JiraRestApi\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 (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Delete component
<?php require 'vendor/autoload.php'; use JiraRestApi\Component\ComponentService; use JiraRestApi\Issue\Version; use JiraRestApi\Project\Component; use JiraRestApi\JiraException; try { $componentService = new ComponentService(); $component = $componentService->get(10000); // component-id $res = $componentService->delete($component); var_dump($res); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Get board list
<?php require 'vendor/autoload.php'; use JiraRestApi\Board\BoardService; try { $board_service = new BoardService(); $board = $board_service->getBoardList(); var_dump($board); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Get boards
<?php require 'vendor/autoload.php'; use JiraRestApi\Board\BoardService; try { $results = []; $startAt = 0; $maxResults = 50; // maximum allowed for board queries do { $response = $this->boardService->getBoards([ 'startAt' => $startAt, 'maxResults' => $maxResults ]); $results = [...$results, ...$response->getBoards()]; $startAt += $maxResults; } while($startAt < $response->total); var_dump($results); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Get board info
<?php require 'vendor/autoload.php'; use JiraRestApi\Board\BoardService; try { $board_service = new BoardService(); $board_id = 1; $board = $board_service->getBoard($board_id); var_dump($board); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Get board issues
<?php require 'vendor/autoload.php'; use JiraRestApi\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 (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Get board epics
<?php require 'vendor/autoload.php'; try { $board_service = new JiraRestApi\Board\BoardService(); $board_id = 1; $epics = $board_service->getBoardEpics($board_id, [ 'maxResults' => 500, ]); foreach ($epics as $epic) { var_dump($epic); } } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Get epic info
<?php require 'vendor/autoload.php'; try { $epic_service = new JiraRestApi\Epic\EpicService(); $epic_id = 1; $epic = $epic_service->getEpic($epic_id); var_dump($epic); } catch (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Get epic issues
<?php require 'vendor/autoload.php'; try { $epic_service = new JiraRestApi\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 (JiraRestApi\JiraException $e) { print('Error Occured! ' . $e->getMessage()); }
Running tests
composer install vendor/bin/phpunit
Unit tests run without a Jira server.
Tests which need a live Jira server extend JiraIntegrationTestCase and are skipped unless the connection is configured.
To run them, copy .env.example to .env and set up your Jira server (see Configuration).
Integration tests create and modify real data (projects, issues, users, ...), so use a test instance, not a production one.
License
Apache V2 License
JIRA Rest API Documents
- 6.4 - https://docs.atlassian.com/jira/REST/6.4/
- Jira Server latest - https://docs.atlassian.com/jira/REST/server/
- Jira Cloud latest - https://docs.atlassian.com/jira/REST/latest/