Code compatibility promise
In compliance with the Release Process and to ensure clear expectations, Oro uses a MAJOR.MINOR.PATCH versioning scheme. While this format resembles Semantic Versioning, it does not follow SemVer’s strict backward-compatibility guarantees between MINOR versions.
In Oro products, the MAJOR version reflects the Symfony LTS version used by that release line. A non-changing MAJOR version indicates only that the underlying major Symfony version remains the same — it does not guarantee API or behavioral stability in Oro code from one MINOR version to the next.
Both MAJOR and MINOR releases may introduce backward-incompatible changes in Oro code.
- System requirements may change between MINOR versions, including updates to the minimally supported versions of PHP, PostgreSQL, and other required components.
- Third-party dependencies used by the Oro application may be upgraded or replaced in MINOR releases. Such updates may include major-version changes or library substitutions in both PHP and JavaScript, and may introduce breaking changes.
PATCH releases are expected to remain fully backward compatible. A breaking change would only be considered for a PATCH release if it were absolutely required to remediate a critical security issue and no viable non-breaking alternative existed. Any such exceptions are extremely rare and will be documented in the CHANGELOG, release notes, and release announcements.
Code covered
This backward compatibility promise applies to all PHP code except for:
- PHPUnit tests (
*/Tests/Unit/)
- Behat tests (
*/Tests/Behat/)
- Functional tests (
*/Tests/Functional/)
- Other test-related code (
*/Test/)
- Test framework bundles:
*/Bundle/TestFrameworkBundle/, */Bundle/TestFrameworkCRMBundle/, */Bundle/DemoDataBundle/, */Bundle/DemoDataCommerceCRMBundle/
- The enterprise package
oro/crm-pro-demo-data-bundle
Allowed changes by code type
Interfaces
Classes
Traits
Functions
| Type of change | Allowed |
|---|
| Add an interface | Yes |
| Remove an interface | No |
| Add a method | No |
| Remove a method | No |
| Add an argument to a method | No |
| Change an argument name | Yes |
| Remove an argument | No |
| Add a type hint to an argument | No |
| Remove a type hint of an argument | No |
| Add a default value to an argument | No |
| Remove a default value of an argument | No |
| Change an argument default value | No |
| Type of change | Allowed |
|---|
| Remove the class entirely | No |
| Add a class | Yes |
| Public properties | |
| Remove public property | No |
| Add public property | Yes |
| Protected properties | |
| Remove protected property | No |
| Add protected property | Yes |
| Private properties | |
| Add private property | Yes |
| Remove private property | Yes |
| Constructors | |
| New public constructor (does not match supertype) | No |
| New protected constructor (does not match supertype) | No |
| Public methods | |
| Remove a public method | No |
| Add an argument | No |
| Remove an argument | No |
| Add a public method | Yes |
| Change an argument name | Yes |
| Add a type hint to an argument | No |
| Remove a type hint of an argument | No |
| Add a default value to an argument | No |
| Remove a default value of an argument | No |
| Change a default value of an argument | No |
| Protected methods | |
| Remove a protected method | No |
| Add an argument | No |
| Remove an argument | No |
| Add a protected method | Yes |
| Change an argument name | Yes |
| Add a type hint to an argument | No |
| Remove a type hint of an argument | No |
| Add a default value to an argument | No |
| Remove a default value of an argument | No |
| Change a default value of an argument | No |
| Private methods | |
| Add a private method | Yes |
| Remove a private method | Yes |
| Add an argument | Yes |
| Remove an argument | Yes |
| Change an argument name | Yes |
| Add a type hint to an argument | Yes |
| Remove a type hint of an argument | Yes |
| Add a default value to an argument | Yes |
| Remove a default value of an argument | Yes |
| Change a default value of an argument | Yes |
| Final classes | |
| Add a public method | Yes |
| Add a protected method | Yes |
| Add an argument to a protected method | Yes |
| Remove a protected method | Yes |
| Change a public method implementation | Yes |
| Change a protected method implementation | Yes |
| Change a private method implementation | Yes |
| Type of change | Allowed |
|---|
| Remove a trait entirely | No |
| Add a trait | Yes |
| Remove a public method | No |
| Add a public method | Yes |
| Remove a protected method | No |
| Add a protected method | Yes |
| Remove protected property | No |
| Add protected property | Yes |
| Add private property | Yes |
| Remove private property | No |
| Add a private method | Yes |
| Remove a private method | No |
| Add an argument to a public method | No |
| Add an argument to a protected method | No |
| Add an argument to a private method | No |
| Add public property | Yes |
| Change a public method implementation | Yes |
| Change a protected method implementation | Yes |
| Change a private method implementation | Yes |
| Change an argument name (any visibility) | Yes |
| Remove an argument (any visibility) | No |
| Add a type hint to an argument (any visibility) | No |
| Remove a type hint of an argument (any visibility) | No |
| Add a default argument value (any visibility) | No |
| Remove a default argument value (any visibility) | No |
| Change a default argument value (any visibility) | No |
| Type of change | Allowed |
|---|
| Remove a function | No |
| Add a new argument | No |
| Remove an argument | No |
| Add a function | No |
| Change a function implementation | Yes |
| Remove an argument type | No |
| Add a default value to an argument | No |
| Remove a default value of an argument | No |
| Change a default value of an argument | No |