A preview of the breaking changes in Drupal 9
Drupal 9 is scheduled to be released on June 03, 2020. This is when the final Drupal 8 minor release 8.9 will also be released. Considering the history of previous Drupal major upgrades, Drupal 9 will relatively be smooth. Thanks to the semantic versioning introduced in Drupal 8. The upgrade to Drupal 9 will just be another minor upgrade with deprecated code removed. Drupal 8 has brought a lot of standardization in the Drupal world, thus allowing Drupal as a project to grow incrementally.
To put it in simple terms, Drupal 9 contains the same code as of 8.9 + deprecated code removed. Here’s a reference image from the Drupal 9 documentation.
That is if you reduce Drupal 9 from the last Drupal 8 version (8.8.x) the rest is just the deprecated code and dependency upgrades.
However, upgrading all the underlying dependencies and removing all deprecated API is a challenging task. Contributors around the world are working hard to get this done especially when the world is facing an epidemic. This is a challenging time for the entire world, yet Drupal contributors have shown their love towards Drupal and are helping it advance to the next release.
This article highlights some of the system requirements, the new dependencies and some of the most commonly used APIs which are going to be removed in 9.0.0.
Let us expedite Drupal’s journey to its 9th version!
| Third-party dependency updates
Upgraded Symfony from 3 to 4.4
Upgraded Twig from 1 to 2
Upgraded CKEditor from 4 and 5
Upgraded PHPUnit from 6 to 7
Upgraded Guzzle from 6.3 to 6.5.2
Popper.js updated to version 2.0.6
| System requirement updates
- Apache, at least version 2.4.7
- PHP - at least 7.3. (PHP 7.4 also supported)
- Database: MySQL (5.7.8), MariaDB (10.2.7), SQLite (3.26), PostgreSQL (10)
| Modules being removed in D9
Field_layout -> Replaced by Layout Builder.
SimpleTest module has been moved to contrib
Action renamed to action UI
| New features in Drupal 9
Drupal 9 will have the same new features as of Drupal 8.9. Thus, Drupal 9.0 will not include new features. But Drupal 9.1 will continue to receive new features as it did for the minor D8 releases.
| Breaking APIs
Following is a list of major APIs which were deprecated in Drupal 8 and will be removed in Drupal 9.0.0. That means if your code contains any of these codes, they need to be replaced before upgrading to Drupal 9. This list is not exhaustive and has been curated by scanning Drupal core codebase for deprecated warnings and sorted according to the usage of these APIs in contributed projects as given Drupal 10 Deprecation Status by Acquia.
drupal_set_message(), drupal_get_message() functions removed. Recommendation: Use messenger service Example: \Drupal::service('messenger')->addMessage('Hello world');
EntityManager has been split into 11 classes. Recommendation: Services like entity_type.manager, entity_type.repository, entity_display.repository etc to be used instead. See change records for more info. Example: \Drupal::entityTypeManager()->getStorage('node')->load(1);
db_*() functions removed
All of the db_* procedural functions part of the Database API layer have been deprecated. Recommendation: Obtain the database connection object and execute operations on it. See change records for more info. Example: $injected_database->query($query, $args, $options); $injected_database->select($table, $alias, $options);
drupal_render() and drupal_render_root() functions Recommendation: Use renderer service Example: \Drupal::service('renderer')->render($elements,$is_recursive_call);
Methods for generating URLs and links deprecated
Drupal::l(), Drupal::url(), Drupal::linkinfo() etc and many methods for generating URL & links are removed Recommendation: See example. Example: EntityInterface::toLink(); EntityInterface::toUrl();
File functions removed
file_unmanaged_copy() file_unmanaged_prepare() file_unmanaged_move() file_unmanaged_delete() file_unmanaged_delete_recursive() file_unmanaged_save_data() file_prepare_directory() file_destination() file_create_filename() Recommendation: Use file_system service Example: \Drupal::service('file_system')->copy($source, $destination, $replace); \Drupal::service('file_system')->move($source, $destination, $replace); \Drupal::service('file_system')->delete($path);
Loading of entities removed
node_load(), entity_load(), file_load() etc removed. Recommendation: Use entity_type.manager service to get specific entity storage and then use the respective load functions Example: use \Drupal\node\Entity\Node; $node = Node::load(1); or $file = \Drupal::entityTypeManager()->getStorage('file')->load(1);
Functions to view entities are deprecated
entity_view(), entity_view_multiple(), comment_view() etc removed. Recommendation: Use entity view builder handler Example: $builder = \Drupal::entityTypeManager()->getViewBuilder('node'); $build = $builder->view($node, 'teaser');
Date formats API changes
Some of the functions and hooks removed (change record)
format_date() hook_date_formats() hook_date_formats_alter() system_get_date_format() system_get_date_format() etc. Recommendation: Use date.formatter service Example: \Drupal::service('date.formatter')->format()
Unicode::* methods removed
Following functions removed (change record)
Unicode::strlen() Unicode::strtoupper() Unicode::strtolower() Unicode::substr() Unicode::strpos() Recommendation: Use mb_* functions Example: mb_strlen();
Functions retrieving extensions info removed
_system_rebuild_module_data(), system_get_info() etc are removed Recommendation: Use extension.list.module, extension.list.profile and extension.list.theme services Example: \Drupal::service('extension.list.module')->getAllInstalledInfo(); \Drupal::service('extension.list.theme')->getAllInstalledInfo();
drupal_get_user_timezone() function removed. Recommendation: Replaced with an event listener which updates the default timezone Example: date_default_timezone_get();
SafeMarkup methods are removed
SafeMarkup::checkPlain() SafeMarkup::format() etc removed. Recommendation: See change record for replacements Example: Html::escape();
| More Changes/Updates
Drupal core themes no longer extend Classy. Read more
Drupal core themes, Bartik, Claro, Seven, and Umami no longer depend on Stable.
New Stable theme for D9, recommended new themes to be built on new D9 stable theme. Old D8 stable to be removed from core and be moved to a contributed project before D10.
A new administration theme, Claro (targeted for inclusion in Drupal 9.1)
Drupal 9 won't be able to run updates from 8.7.x or earlier databases anymore, it is necessary for all new updates added to the code base to be tested from a Drupal 8.8.x starting point. Read more
Changes to how HTML Elements are inserted via AJAX commands. Read more
ZendFramework/* packages have been updated to their Laminas equivalents. Read more
PhantonJS based testing removed. Read more
The jQuery UI asset libraries not in use by Drupal core have been marked deprecated and have been removed from core in Drupal 9.
Drupal 9 will continue to depend on CKEditor 4 and jQuery 3.4.
Modules to be compatible with Drupal 8 and 9 at the same time and to support semantic versioning for contributed projects
jquery.cookie has been replaced with js-cookie version 2.
At this point, 9.0.0-beta2 is released, which means the code for 9.0.0 is stable and is ready for testing by end-users. Now is a good time to test upgrade your existing D8 sites to the latest version of 9. If you have contributed a project in drupal.org, it is also a good time to check your extensions for D9 readiness. There are several tools which can speed up this process of making your extensions compatible with D9.
Have questions about how Drupal 9 will impact your site? We are here to help. Check out our Drupal Services or send us an email at [email protected]!
| Important References
- Drupal 9 documentation
- Drupal 9 Deprecation Status
- How to prepare your Drupal 7 or 8 sites for Drupal 9
- [META] Release Drupal 9 on June 3 2020
- Search for Deprecated code
- “State of Drupal 9” slideshow by Gábor Hojtsy
If you see any discrepancies in the information provided above, please let us know.