The contributed module ecosystem has had to craft ways to provide backward compatibility between minor and major versions of Drupal core.
- Minor versions: silence runtime deprecations triggered while supporting the current major version's minor versions with security coverage.
- Major versions: prevent calling deprecated code that was removed while bridging support with the latest minor version of the last major version (9.5 && 10.0.)
It often looks like this:
if (version_compare(\Drupal::VERSION, '9.4', '>=')) {
// Do the new way introduced in 9.4, and supported in 9.5 and 10.0.
}
else {
// @phpstan-ignore-next-line
// Call the deprecated code for 9.2 and 9.3.
}
This is painful to copy around. By adding a new Drupal\Component\Utility\DeprecationHelper utility class, any module can now call the correct code based on the provided version.
$result = DeprecationHelper::backwardsCompatibleCall(
currentVersion: \Drupal::VERSION,
deprecatedVersion: '10.3',
currentCallable: fn() => Role::loadMultiple(),
deprecatedCallable: fn() => user_roles(),
);
PHPStan's deprecation rule package can now define custom deprecation scopes (see https://github.com/phpstan/phpstan-deprecation-rules/pull/99.) The phpstan-drupal package can then consider this as a deprecated scope, removing the need for @phpstan-ignore-next-line throughout backward compatibility layer code. This will be available soon as we work towards Drupal 11 readiness.
Drupal rector support was merged into main in september 2023.
Comments
This helper method is a great example of using named arguments
@see https://stitcher.io/blog/php-8-named-arguments
When installing a module
When installing a module (that implements above pattern) on an installation with older Drupal version (8, 9, 10, 11), (how) will this DeprecationHelper be installed, called?