lesstif/jira-cloud-restapi
PHP 8.1+ client for Jira Cloud REST API. Create and manage issues, projects, users, and more with JSON mapping support, dotenv configuration, and Atlassian Document Format (ADF) tools. Install via Composer; Laravel-friendly integration.
Installation:
composer require lesstif/jira-cloud-restapi
Register the service provider in config/app.php:
'providers' => [
// ...
JiraCloud\JiraCloudApiServiceProvider::class,
],
Configuration:
.env.example to .env and update:
JIRAAPI_V3_HOST='https://your-jira.atlassian.net'
JIRAAPI_V3_USER='jira-username'
JIRAAPI_V3_PERSONAL_ACCESS_TOKEN='your-token-here'
ArrayConfiguration in code.First Use Case: Fetch a project's issues using JQL:
use JiraCloud\Issue\IssueService;
$issues = app(IssueService::class)->searchIssues('project = TEST ORDER BY created DESC');
Issue Management:
IssueService::createIssue() with a JiraCloud\Issue\Issue object.
$issue = (new Issue())
->setProjectKey('TEST')
->setSummary('Fix bug')
->setDescription('Detailed description');
$created = $issueService->createIssue($issue);
$issues = $issueService->searchIssues('project = TEST AND status = "In Progress"');
transitionIssue() with transition IDs:
$issueService->transitionIssue($issueKey, $transitionId);
Project Operations:
ProjectService for project lifecycle:
$project = (new Project())
->setKey('NEW')
->setName('New Project');
$projectService->createProject($project);
Bulk Operations:
createIssues() for multiple issues:
$issueService->createIssues([$issue1, $issue2]);
Integration with Laravel:
$this->app->bind(IssueService::class, function ($app) {
return new IssueService($app->make(JiraCloudConfiguration::class));
});
// In a facade class
public static function searchIssues($jql) {
return app(IssueService::class)->searchIssues($jql);
}
Event Listeners:
HandleIncomingWebhook to process Jira webhook events:
public function handleIncomingWebhook(Request $request) {
$payload = $request->json()->all();
// Process payload (e.g., update local DB)
}
Authentication:
JIRAAPI_V3_COOKIE_AUTH_ENABLED, ensure the cookie file path is writable.Rate Limiting:
try {
$result = $service->someApiCall();
} catch (RateLimitExceededException $e) {
sleep(2); // Backoff
retry();
}
Pagination:
isLast in paginated responses to avoid missing data:
$issues = $issueService->searchIssues('project = TEST');
while (!$issues->isLast) {
$issues = $issueService->searchIssues('project = TEST', $issues->startAt + $issues->maxResults);
}
Field Validation:
getAllFields() to inspect available fields:
$fields = $issueService->getAllFields();
Error Handling:
JiraException:
try {
$issueService->createIssue($issue);
} catch (JiraException $e) {
Log::error('Jira API Error: ' . $e->getMessage());
throw new \RuntimeException('Failed to create issue', 0, $e);
}
Logging:
.env:
JIRAAPI_V3_LOG_ENABLED=true
JIRAAPI_V3_LOG_FILE=storage/logs/jira.log
Log::debug('Jira API Response', ['data' => $response]);
Testing:
JiraCloudApiServiceProvider in tests:
$this->app->instance(JiraCloudConfiguration::class, $mockConfig);
Performance:
$projects = Cache::remember('jira_projects', now()->addHours(1), function () {
return $projectService->getAllProjects();
});
Extensions:
class CustomIssueService extends IssueService {
public function createBug($summary, $description) {
$issue = (new Issue())
->setProjectKey('BUG')
->setSummary($summary)
->setDescription($description)
->setIssueType('Bug');
return $this->createIssue($issue);
}
}
Proxy Support:
.env if behind a corporate firewall:
JIRAAPI_V3_PROXY_SERVER='proxy.example.com'
JIRAAPI_V3_PROXY_PORT=8080
Webhook Validation:
$publicKey = 'your-atlassian-public-key';
$signature = $request->header('X-Atlassian-Event-Key');
$payload = $request->getContent();
if (!hash_equals($signature, hash_hmac('sha1', $payload, $publicKey))) {
abort(403, 'Invalid signature');
}
How can I help you explore Laravel packages today?