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

Block_place

Entityreference

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 9 Deprecation Status by Acquia.

drupal_set_message() removed

change record

drupal_set_message(), drupal_get_message() functions removed. Recommendation: Use messenger service Example: \Drupal::service('messenger')->addMessage('Hello world');

Drupal::entityManager() removed

change record

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

change record

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() removed

change record

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

change record

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

change record

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

change record

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

ode\Entity\Node; $node = Node::load(1); or $file = \Drupal::entityTypeManager()->getStorage('file')->load(1);

Functions to view entities are deprecated

change record

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

change record

_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() removed

change record

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

change record

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.

| Conclusion

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

If you see any discrepancies in the information provided above, please let us know.

Thanks!