All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Nothing yet.
v2.9.1 - 2026-04-03
- Fixed wrongly triggered deprecation messages in
Redmine\Client\NativeCurlClientandRedmine\Client\Psr18Client. - Allow unset version from an issue.
v2.9.0 - 2026-03-08
- New method
Redmine\Api\Attachment::fromHttpClient()for creating the class. - New method
Redmine\Api\CustomField::fromHttpClient()for creating the class. - New method
Redmine\Api\Group::fromHttpClient()for creating the class. - New method
Redmine\Api\Issue::fromHttpClient()for creating the class. - New method
Redmine\Api\IssueCategory::fromHttpClient()for creating the class. - New method
Redmine\Api\IssuePriority::fromHttpClient()for creating the class. - New method
Redmine\Api\IssueRelation::fromHttpClient()for creating the class. - New method
Redmine\Api\IssueStatus::fromHttpClient()for creating the class. - New method
Redmine\Api\Membership::fromHttpClient()for creating the class. - New method
Redmine\Api\News::fromHttpClient()for creating the class. - New method
Redmine\Api\Project::fromHttpClient()for creating the class. - New method
Redmine\Api\Query::fromHttpClient()for creating the class. - New method
Redmine\Api\Role::fromHttpClient()for creating the class. - New method
Redmine\Api\Search::fromHttpClient()for creating the class. - New method
Redmine\Api\TimeEntry::fromHttpClient()for creating the class. - New method
Redmine\Api\TimeEntryActivity::fromHttpClient()for creating the class. - New method
Redmine\Api\Tracker::fromHttpClient()for creating the class. - New method
Redmine\Api\User::fromHttpClient()for creating the class. - New method
Redmine\Api\Version::fromHttpClient()for creating the class. - New method
Redmine\Api\Wiki::fromHttpClient()for creating the class. - Add support for PHP 8.5
- Add support for Redmine 6.1.
- Behaviour-driven tests are run against Redmine 6.1.1, 6.0.8, 5.1.11.
Redmine\Api\Attachment::__construct()is deprecated and will be set to private in future, use\Redmine\Api\Attachment::fromHttpClient()instead.- Extending
Redmine\Api\Attachmentis deprecated and will be set to final in future, create a wrapper class instead. Redmine\Api\CustomField::__construct()is deprecated and will be set to private in future, use\Redmine\Api\CustomField::fromHttpClient()instead.- Extending
Redmine\Api\CustomFieldis deprecated and will be set to final in future, create a wrapper class instead. Redmine\Api\Group::__construct()is deprecated and will be set to private in future, use\Redmine\Api\Group::fromHttpClient()instead.- Extending
Redmine\Api\Groupis deprecated and will be set to final in future, create a wrapper class instead. Redmine\Api\Issue::__construct()is deprecated and will be set to private in future, use\Redmine\Api\Issue::fromHttpClient()instead.- Extending
Redmine\Api\Issueis deprecated and will be set to final in future, create a wrapper class instead. Redmine\Api\IssueCategory::__construct()is deprecated and will be set to private in future, use\Redmine\Api\IssueCategory::fromHttpClient()instead.- Extending
Redmine\Api\IssueCategoryis deprecated and will be set to final in future, create a wrapper class instead. Redmine\Api\IssuePriority::__construct()is deprecated and will be set to private in future, use\Redmine\Api\IssuePriority::fromHttpClient()instead.- Extending
Redmine\Api\IssuePriorityis deprecated and will be set to final in future, create a wrapper class instead. Redmine\Api\IssueRelation::__construct()is deprecated and will be set to private in future, use\Redmine\Api\IssueRelation::fromHttpClient()instead.- Extending
Redmine\Api\IssueRelationis deprecated and will be set to final in future, create a wrapper class instead. Redmine\Api\IssueStatus::__construct()is deprecated and will be set to private in future, use\Redmine\Api\IssueStatus::fromHttpClient()instead.- Extending
Redmine\Api\IssueStatusis deprecated and will be set to final in future, create a wrapper class instead. Redmine\Api\Membership::__construct()is deprecated and will be set to private in future, use\Redmine\Api\Membership::fromHttpClient()instead.- Extending
Redmine\Api\Membershipis deprecated and will be set to final in future, create a wrapper class instead. Redmine\Api\News::__construct()is deprecated and will be set to private in future, use\Redmine\Api\News::fromHttpClient()instead.- Extending
Redmine\Api\Newsis deprecated and will be set to final in future, create a wrapper class instead. Redmine\Api\Project::__construct()is deprecated and will be set to private in future, use\Redmine\Api\Project::fromHttpClient()instead.- Extending
Redmine\Api\Projectis deprecated and will be set to final in future, create a wrapper class instead. Redmine\Api\Query::__construct()is deprecated and will be set to private in future, use\Redmine\Api\Query::fromHttpClient()instead.- Extending
Redmine\Api\Queryis deprecated and will be set to final in future, create a wrapper class instead. Redmine\Api\Role::__construct()is deprecated and will be set to private in future, use\Redmine\Api\Role::fromHttpClient()instead.- Extending
Redmine\Api\Roleis deprecated and will be set to final in future, create a wrapper class instead. Redmine\Api\Search::__construct()is deprecated and will be set to private in future, use\Redmine\Api\Search::fromHttpClient()instead.- Extending
Redmine\Api\Searchis deprecated and will be set to final in future, create a wrapper class instead. Redmine\TimeEntry::__construct()is deprecated and will be set to private in future, use\Redmine\TimeEntry::fromHttpClient()instead.- Extending
Redmine\TimeEntryis deprecated and will be set to final in future, create a wrapper class instead. Redmine\Api\TimeEntryActivity::__construct()is deprecated and will be set to private in future, use\Redmine\Api\TimeEntryActivity::fromHttpClient()instead.- Extending
Redmine\Api\TimeEntryActivityis deprecated and will be set to final in future, create a wrapper class instead. Redmine\Api\Tracker::__construct()is deprecated and will be set to private in future, use\Redmine\Api\Tracker::fromHttpClient()instead.- Extending
Redmine\Api\Trackeris deprecated and will be set to final in future, create a wrapper class instead. Redmine\Api\User::__construct()is deprecated and will be set to private in future, use\Redmine\Api\User::fromHttpClient()instead.- Extending
Redmine\Api\Useris deprecated and will be set to final in future, create a wrapper class instead. Redmine\Api\Version::__construct()is deprecated and will be set to private in future, use\Redmine\Api\Version::fromHttpClient()instead.- Extending
Redmine\Api\Versionis deprecated and will be set to final in future, create a wrapper class instead. Redmine\Api\Wiki::__construct()is deprecated and will be set to private in future, use\Redmine\Api\Wiki::fromHttpClient()instead.- Extending
Redmine\Api\Wikiis deprecated and will be set to final in future, create a wrapper class instead.
- Drop support for Redmine 5.0.x.
v2.8.0 - 2025-05-30
- Added support for PHP 8.4
- Support for Redmine 6.0.x was added.
- New class
Redmine\Http\HttpFactoryto createRedmine\Http\RequestandRedmine\Http\Responseinstances.
- Improvement in
Redmine\Client\AbstractApi::retrieveData()by usingtotal_countfrom redmine response to avoid unnecessary http requests. - Behaviour-driven tests are run against Redmine 6.0.5, 5.1.8, 5.0.12.
Redmine\Client\Client::requestGet()is deprecated, use\Redmine\Client\Client::request()instead.Redmine\Client\Client::requestPost()is deprecated, use\Redmine\Client\Client::request()instead.Redmine\Client\Client::requestPut()is deprecated, use\Redmine\Client\Client::request()instead.Redmine\Client\Client::requestDelete()is deprecated, use\Redmine\Client\Client::request()instead.Redmine\Client\Client::getLastResponseStatusCode()is deprecated, use\Redmine\Client\Client::request()or\Redmine\Api\AbstractApi::getLastResponse()->getStatusCode()instead.Redmine\Client\Client::getLastResponseContentType()is deprecated, use\Redmine\Client\Client::request()or\Redmine\Api\AbstractApi::getLastResponse()->getContentType()instead.Redmine\Client\Client::getLastResponseBody()is deprecated, use\Redmine\Client\Client::request()or\Redmine\Api\AbstractApi::getLastResponse()->getContent()instead.
- Support for Redmine 4.2.x was dropped.
v2.7.0 - 2024-07-10
- New method
Redmine\Api\CustomField::listNames()for listing the ids and names of all custom fields. - New method
Redmine\Api\Group::listNames()for listing the ids and names of all groups. - New method
Redmine\Api\IssueCategory::listNamesByProject()for listing the ids and names of all issue categories of a project. - New method
Redmine\Api\IssueStatus::listNames()for listing the ids and names of all issue statuses. - New method
Redmine\Api\Project::listNames()for listing the ids and names of all projects. - New method
Redmine\Api\Role::listNames()for listing the ids and names of all roles. - New method
Redmine\Api\TimeEntryActivity::listNames()for listing the ids and names of all time entry activities. - New method
Redmine\Api\Tracker::listNames()for listing the ids and names of all trackers. - New method
Redmine\Api\User::listLogins()for listing the ids and logins of all users. - New method
Redmine\Api\Version::listNamesByProject()for listing the ids and names of all versions of a project. - Support for Redmine 4.2.x was added.
- Behaviour-driven tests are run against Redmine 4.2.10, 5.0.9 and 5.1.3.
Redmine\Api\CustomField::listing()is deprecated, use\Redmine\Api\CustomField::listNames()instead.Redmine\Api\CustomField::getIdByName()is deprecated, use\Redmine\Api\CustomField::listNames()instead.Redmine\Api\Group::listing()is deprecated, use\Redmine\Api\Group::listNames()instead.Redmine\Api\IssueCategory::listing()is deprecated, use\Redmine\Api\IssueCategory::listNamesByProject()instead.Redmine\Api\IssueCategory::getIdByName()is deprecated, use\Redmine\Api\IssueCategory::listNamesByProject()instead.Redmine\Api\IssueStatus::listing()is deprecated, use\Redmine\Api\IssueStatus::listNames()instead.Redmine\Api\IssueStatus::getIdByName()is deprecated, use\Redmine\Api\IssueStatus::listNames()instead.Redmine\Api\Project::listing()is deprecated, use\Redmine\Api\Project::listNames()instead.Redmine\Api\Project::getIdByName()is deprecated, use\Redmine\Api\Project::listNames()instead.Redmine\Api\Role::listing()is deprecated, use\Redmine\Api\Role::listNames()instead.Redmine\Api\TimeEntryActivity::listing()is deprecated, use\Redmine\Api\TimeEntryActivity::listNames()instead.Redmine\Api\TimeEntryActivity::getIdByName()is deprecated, use\Redmine\Api\TimeEntryActivity::listNames()instead.Redmine\Api\Tracker::listing()is deprecated, use\Redmine\Api\Tracker::listNames()instead.Redmine\Api\Tracker::getIdByName()is deprecated, use\Redmine\Api\Tracker::listNames()instead.Redmine\Api\User::listing()is deprecated, use\Redmine\Api\User::listLogins()instead.Redmine\Api\User::getIdByUsername()is deprecated, use\Redmine\Api\User::listLogins()instead.Redmine\Api\Version::listing()is deprecated, use\Redmine\Api\Version::listNamesByProject()instead.Redmine\Api\Version::getIdByName()is deprecated, use\Redmine\Api\Version::listNamesByProject()instead.
- Tests and development files were removed from releases.
v2.6.0 - 2024-03-25
- New method
Redmine\Api\Attachment::update()for updating attachments. - New interface
Redmine\Http\HttpClientfor new minimalistic HTTP clients. - New interface
Redmine\Http\Requestfor sending data with new minimalistic HTTP clients. - New method
Redmine\Api\...::getLastResponse()to get the last response made by the API class. - Add support for custom arrays in
Redmine\Serializer\XmlSerializer.
- Calling
Redmine\Api\IssueRelation::create()without the mandatory parameterissue_to_idthrows aRedmine\Exception\MissingParameterExceptioninstead of returning a error array
- Parameter types for IDs were fixed in API for attachments, groups, issues, project, users and versions.
- Return types were fixed in API for attachments, groups, time entries, issues, project, users, versions and wiki.
- Wiki pages with special characters are now handled correctly.
Redmine\Api\Attachment::download()returns false on error instead of the HTML error page.
Redmine\Api\AbstractApi::get()is deprecated, use\Redmine\Http\HttpClient::request()instead.Redmine\Api\AbstractApi::post()is deprecated, use\Redmine\Http\HttpClient::request()instead.Redmine\Api\AbstractApi::put()is deprecated, use\Redmine\Http\HttpClient::request()instead.Redmine\Api\AbstractApi::delete()is deprecated, use\Redmine\Http\HttpClient::request()instead.- The constant
Redmine\Api\Issue::PRIO_LOWis deprecated. - The constant
Redmine\Api\Issue::PRIO_NORMALis deprecated. - The constant
Redmine\Api\Issue::PRIO_HIGHis deprecated. - The constant
Redmine\Api\Issue::PRIO_URGENTis deprecated. - The constant
Redmine\Api\Issue::PRIO_IMMEDIATEis deprecated.
v2.5.0 - 2024-02-05
- Added support for updating groups with method
Redmine\Api\Group::update(). - New method
Redmine\Api\Project::close()to close a project. - New method
Redmine\Api\Project::reopen()to reopen a project. - New method
Redmine\Api\Project::archive()to archive a project. - New method
Redmine\Api\Project::unarchive()to unarchive a project. - New interface
Redmine\Http\Responseas a data object for Redmine server responses. - New method
UnexpectedResponseException::getResponse()to get the last response responsible for the exception.
- The last response is saved in
Redmine\Api\AbstractApito prevent race conditions withRedmine\Client\Clientimplementations.
v2.4.0 - 2024-01-04
- Added support for PHP 8.3
- New method
Redmine\Api\CustomField::list()to list custom fields. - New method
Redmine\Api\Group::list()to list groups. - New method
Redmine\Api\Issue::list()to list issues. - New method
Redmine\Api\IssueCategory::listByProject()to list issue categories from a project. - New method
Redmine\Api\IssuePriority::list()to list issue priorities. - New method
Redmine\Api\IssueRelation::listByIssueId()to list relations from an issue. - New method
Redmine\Api\IssueStatus::list()to list issue statuses. - New method
Redmine\Api\Membership::listByProject()to list memberships from a project. - New method
Redmine\Api\News::list()to list news from all project. - New method
Redmine\Api\News::listByProject()to list news from a project. - New method
Redmine\Api\Project::list()to list projects. - New method
Redmine\Api\Query::list()to list queries. - New method
Redmine\Api\Role::list()to list roles. - New method
Redmine\Api\Search::listByQuery()to list search results by query. - New method
Redmine\Api\TimeEntry::list()to list time entries. - New method
Redmine\Api\TimeEntryActivity::list()to list time entry activities. - New method
Redmine\Api\Tracker::list()to list trackers. - New method
Redmine\Api\User::list()to list users. - New method
Redmine\Api\Version::listByProject()to list versions from a project. - New method
Redmine\Api\Wiki::listByProject()to list wiki pages from a project. - New exception
Redmine\Exception\UnexpectedResponseExceptionif the Redmine server responded with an unexpected body.
- Restore BC in possible return types in
Redmine\Api\...::all()methods
Redmine\Api\CustomField::all()is deprecated, useRedmine\Api\CustomField::list()insteadRedmine\Api\Group::all()is deprecated, useRedmine\Api\Group::list()insteadRedmine\Api\Issue::all()is deprecated, useRedmine\Api\Issue::list()insteadRedmine\Api\IssueCategory::all()is deprecated, useRedmine\Api\IssueCategory::listByProject()insteadRedmine\Api\IssuePriority::all()is deprecated, useRedmine\Api\IssuePriority::list()insteadRedmine\Api\IssueRelation::all()is deprecated, useRedmine\Api\IssueRelation::listByIssueId()insteadRedmine\Api\IssueStatus::all()is deprecated, useRedmine\Api\IssueStatus::list()insteadRedmine\Api\Membership::all()is deprecated, useRedmine\Api\Membership::listByProject()insteadRedmine\Api\News::all()is deprecated, useRedmine\Api\News::list()orRedmine\Api\News::listByProject()insteadRedmine\Api\Project::all()is deprecated, useRedmine\Api\Project::list()insteadRedmine\Api\Query::all()is deprecated, useRedmine\Api\Query::list()insteadRedmine\Api\Role::all()is deprecated, useRedmine\Api\Role::list()insteadRedmine\Api\Search::search()is deprecated, useRedmine\Api\Search::listByQuery()insteadRedmine\Api\TimeEntry::all()is deprecated, useRedmine\Api\TimeEntry::list()insteadRedmine\Api\TimeEntryActivity::all()is deprecated, useRedmine\Api\TimeEntryActivity::list()insteadRedmine\Api\Tracker::all()is deprecated, useRedmine\Api\Tracker::list()insteadRedmine\Api\User::all()is deprecated, useRedmine\Api\User::list()insteadRedmine\Api\Version::all()is deprecated, useRedmine\Api\Version::listByProject()insteadRedmine\Api\Wiki::all()is deprecated, useRedmine\Api\Wiki::listByProject()instead
v2.3.0 - 2023-10-09
- New class
Redmine\Serializer\PathSerializerto build an URL path with query parameters. - New class
Redmine\Serializer\JsonSerializerto encode or normalize JSON data. - New class
Redmine\Serializer\XmlSerializerto encode or normalize XML data. - Allow
Psr\Http\Message\RequestFactoryInterfaceas Argument #2 ($requestFactory) inRedmine\Client\Psr18Client::__construct() - Added support for PHP 8.2
- Providing Argument #2 ($requestFactory) in
Redmine\Client\Psr18Client::__construct()as typePsr\Http\Message\ServerRequestFactoryInterfaceis deprecated, provide as typePsr\Http\Message\RequestFactoryInterfaceinstead Redmine\Api\AbstractApi::attachCustomFieldXML()is deprecated, useRedmine\Serializer\XmlSerializer::createFromArray()insteadRedmine\Api\Project::prepareParamsXml()is deprecated, useRedmine\Serializer\XmlSerializer::createFromArray()instead
v2.2.0 - 2022-03-01
- New method
Redmine\Client\AbstractApi::retrieveData()to retrieve as many elements as you want as array (even if the total number of elements is greater than 100). - New exception
Redmine\Client\SerializerExceptionfor JSON/XML serializer related exceptions
- Allow unassign user from an issue
Redmine\Api\AbstractApi::retrieveAll()is deprecated, useRedmine\Api\AbstractApi::retrieveData()instead
v2.1.1 - 2022-01-15
- Special characters in comments when updating time entries will be escaped
v2.1.0 - 2022-01-04
- Added support for PHP 8.1
- New interface
Redmine\Exceptionthat is implemented by every library-related exception - New exception
Redmine\Exception\ClientExceptionfor client related exceptions - New exception
Redmine\Exception\InvalidApiNameExceptionif an invalid API instance is requested - New exception
Redmine\Exception\InvalidParameterExceptionfor invalid parameter provided to an API instance - New exception
Redmine\Exception\MissingParameterExceptionfor missing parameter while using an API instance
- Switched from Travis-CI to Github Actions
- Avoid warning if path of uploaded file is longer than the maximum allowed path length
Redmine\Api\AbstractApi::lastCallFailed()is deprecated, useRedmine\Client\Client::getLastResponseStatusCode()instead- Uploading an attachment using
Redmine\Api\Attachment::upload()with filepath is deprectead, usefile_get_contents()to upload the file content instead
v2.0.1 - 2021-09-22
- Fixed the handling of a response if the content type header is missing
v2.0.0 - 2021-06-08
- BREAKING: Deprecated client
Redmine\Clientwas removed, useRedmine\Client\NativeCurlClientorRedmine\Client\Psr18Clientinstead - BREAKING:
src/autoload.phpwas removed, use thevendor/autoload.phpfrom Composer instead
v1.8.1 - 2021-06-01
AbstractApi::get()returnsnullon empty response body instead offalsefor BC reasons- Use uppercase in HTTP verbs
v1.8.0 - 2021-04-19
- New native cURL client
Redmine\Client\NativeCurlClientas a replacement forRedmine\Client - This
CHANGELOG.mdfile
- Better type checking thanks to typed properties
- Move
example.phpinto newdocsfolder
- Drop support for PHP 7.3
Redmine\Client::getCheckSslHost()always returns as boolean
Redmine\Clientis deprecated, useRedmine\Client\NativeCurlClientorRedmine\Client\Psr18Clientinstead- Magic getter in
Redmine\Clientis deprecated, useRedmine\Client::getApi()instead Redmine\Client::api()is deprecated, useRedmine\Client::getApi()insteadRedmine\Client::get()is deprecated, useRedmine\Client::requestGet()insteadRedmine\Client::post()is deprecated, useRedmine\Client::requestPost()insteadRedmine\Client::put()is deprecated, useRedmine\Client::requestPut()insteadRedmine\Client::delete()is deprecated, useRedmine\Client::requestDelete()insteadRedmine\Client::setCheckSslCertificate()is deprecated, useRedmine\Client::setCurlOption()insteadRedmine\Client::setCheckSslHost()is deprecated, useRedmine\Client::setCurlOption()insteadRedmine\Client::setSslVersion()is deprecated, useRedmine\Client::setCurlOption()insteadRedmine\Client::setUseHttpAuth()is deprecated, useRedmine\Client::setCurlOption()insteadRedmine\Client::setPort()is deprecated, useRedmine\Client::setCurlOption()insteadRedmine\Client::getResponseCode()is deprecated, useRedmine\Client::getLastResponseStatusCode()insteadRedmine\Client::setImpersonateUser()is deprecated, useRedmine\Client::startImpersonateUser()andRedmine\Client::stopImpersonateUser()insteadRedmine\Client::setCustomHost()is deprecated, useRedmine\Client::setCurlOption()insteadRedmine\Client::getUrl()is deprecated, you should stop using itRedmine\Client::decode()is deprecated, you should stop using itRedmine\Client::getCheckSslCertificate()is deprecated, you should stop using itRedmine\Client::getCheckSslHost()is deprecated, you should stop using itRedmine\Client::getSslVersion()is deprecated, you should stop using itRedmine\Client::getUseHttpAuth()is deprecated, you should stop using itRedmine\Client::getPort()is deprecated, you should stop using itRedmine\Client::getImpersonateUser()is deprecated, you should stop using itRedmine\Client::getCustomHost()is deprecated, you should stop using itRedmine\Client::getCurlOptions()is deprecated, you should stop using itRedmine\Client::prepareRequest()is deprecated, you should stop using itRedmine\Client::processCurlResponse()is deprecated, you should stop using itRedmine\Client::runRequest()is deprecated, you should stop using it
v1.7.0 - 2021-03-22
- New interface
Redmine\Client\Clientfor all clients - New PSR-18 based client
Redmine\Client\Psr18Clientfor usage with e.g.Guzzle - New method
Redmine\Client::getApi()for returning an API instance,Redmine\Client::api()and magic getterRedmine\Client->issuewill be deprecated in future. - New method
Redmine\Client::startImpersonateUser()to set an impersonated user,Redmine\Client::setImpersonateUser()will be deprecated in future. - New method
Redmine\Client::stopImpersonateUser()to stop impersonating an user. - New method
Redmine\Client::requestGet()to create and send a GET request,Redmine\Client::get()will be deprecated in future. - New method
Redmine\Client::requestPost()to create and send a POST request,Redmine\Client::post()will be deprecated in future. - New method
Redmine\Client::requestPut()to create and send a PUT request,Redmine\Client::put()will be deprecated in future. - New method
Redmine\Client::requestDelete()to create and send a DELETE request,Redmine\Client::delete()will be deprecated in future. - New method
Redmine\Client::getLastResponseStatusCode()returns status code of the last response,Redmine\Client::getResponseCode()will be deprecated in future. - New method
Redmine\Client::getLastResponseContentType()returns the content type of the last response. - New method
Redmine\Client::getLastResponseBody()returns the raw body of the last response.
- Move JSON and XML decoding directly into
Redmine\Api\AbstractApiinstead of the client.
- escape special chars in title, description, etc in wiki, issue, project and time_entry api.
v1.6.0 - 2021-01-02
- Added support for PHP 8.0
- New method
Redmine\Api\Attachment::remove()to delete an attachment - New method
Redmine\Api\TimeEntryActivity::listing()to list time entry activities - New method
Redmine\Api\TimeEntryActivity::getIdByName()to get a time entry activity id by its name
- Removed support for PHP 5.6, 7.0, 7.1 and 7.2
v1.5.22 - 2020-08-07
- Added support for filename parameter to attachment upload
- Added file upload with wiki
- Fixed a warning on file upload
- Fixed a lot of warnings related to
custom_field - Fixed custom field file type