Skip to main content
All posts
Drupal Upgrade PHP Oct 9, 2026 · 2 min read

Upgrading from Drupal 10 to Drupal 11: What Actually Changes

Drupal 11 dropped PHP 8.1 support, removed deprecated APIs, and shipped with Symfony 7. Here's a practical guide to what the upgrade involves and how to approach it without breaking production.

Article

The Good News First

If your Drupal 10 site is well-maintained — meaning you've been keeping up with minor releases and have addressed deprecation warnings — upgrading to Drupal 11 is the smoothest major version transition the project has ever had. The architectural fundamentals didn't change. The Symfony component layer is still there. The hook system still works (though events are increasingly preferred).

The bad news: if you've been ignoring deprecation warnings, the upgrade will surface every one of them.

What Actually Changed

PHP 8.2 Minimum

Drupal 11 requires PHP 8.2 as the minimum version, dropping support for PHP 8.1. In practice, most hosting environments are already on 8.2+, but check your stack before starting.

composer require drupal/core:^11 --update-with-dependencies

Symfony 7

The upgrade from Symfony 6 to Symfony 7 is the most significant internal change. For most site builders and module developers, this is invisible. For anyone using Symfony components directly in custom code, review the Symfony 7 changelog for breaking changes — particularly around the HTTP client, security components, and console.

Deprecated APIs Removed

Any API that was deprecated in Drupal 10.x is gone in Drupal 11. The most commonly hit removals include:

  • hook_node_access_records_alter() signature changes
  • Several \Drupal\Core\Entity method removals
  • Old-style plugin annotation formats (replaced by PHP attributes)
  • The seven and bartik themes (already removed in D10, but contrib modules sometimes referenced them)

CKEditor 5 Only

CKEditor 4 support is fully removed. If you're still using it via contrib, migrate to CKEditor 5 before upgrading to D11.

The Upgrade Process

Here's the sequence I use for client upgrades:

  1. Run the Upgrade Status module on the D10 site. Fix every deprecated API warning it surfaces — don't skip this step.
  2. Check contrib module compatibility via the D11 compatibility tracker at drupal.org. Most major modules have D11-compatible releases, but some smaller ones don't.
  3. Update your composer.json to require drupal/core:^11 and run composer update in a feature branch.
  4. Run drush updb — D11 ships with several database updates that handle schema migrations automatically.
  5. Test thoroughly — particularly custom modules that use deprecated APIs, and anything touching the entity system.

Custom Module Checklist

For each custom module, verify:

  • No references to removed D10 deprecated code
  • Plugin definitions use PHP attributes (#[Plugin\...]) rather than annotation docblocks where the D11 attribute-based discovery is in play
  • Any direct Symfony service usage is compatible with Symfony 7
Run drush cr && drush php:eval "drupal_check_module('your_module')" as a quick sanity check, but don't rely on it alone — it misses runtime deprecations.

Timeline Considerations

Drupal 10 reaches end-of-life in January 2026. That's plenty of time to plan a migration, but "plenty of time" has a way of disappearing when you factor in agency schedules, client approvals, and contrib module readiness. Start the Upgrade Status audit now, even if you're not upgrading until next year.