1. Go to this page and download the library: Download lesstif/jira-cloud-restapi library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
lesstif / jira-cloud-restapi example snippets
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',
]
));
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
\$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());
}
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());
}
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());
}
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());
}
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());
}
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());
}
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());
}
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());
}
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());
}
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());
}
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());
}
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());
}
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());
}
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());
}
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());
}
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());
}
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());
}
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());
}
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());
}