Where Older Books and Tutorials Are Outdated

This content was generated with the assistance of AI and should be verified against the official Drupal documentation before being relied on in production.

This sub-section’s Drupal bibliography lists the reference material consulted while preparing these pages.

Drupal has a six-month release cadence and a deprecation policy, so a book that was correct when it was printed can describe a module, a hook style or a requirement that has since changed. This page was checked on 2026-10-30 against Drupal 11.4.x, with Drupal 12.0.0 scheduled for the week of 2026-12-07 and the end of life of Drupal 10 scheduled for 2026-12-09. It lists, area by area, what older material says, what is true now, since which version, and where the official source is. It covers three books published by Packt in 2023: Drupal 10 Development Cookbook by Matt Glaman and Kevin Quillen (third edition), Drupal 10 Masterclass by Adam Bergstein and Modernizing Drupal 10 Theme Development by Luca Lusso, and the advice that recurs in tutorials, blog posts and community answers from 2022 to 2025. In the tables they are shortened to Development Cookbook, Masterclass and Theme Development. The books are cited only to show where they differ from current documentation; none of their text, figures or screenshots is reproduced, and their explanations of concepts such as the Entity API, Views, the render pipeline and the test pyramid remain a good introduction. Where any older source and the official documentation disagree, the official documentation wins.

The books target Drupal 10.0 or 10.1, PHP 8.1 and Drush 12. Everything below follows from that baseline: the platform moved twice (Drupal 11 in 2024 and Drupal 12 in preparation), and several features that the books present as new or experimental became ordinary, while a few that they present as core were removed. The timeline behind most rows is on Versions, Release Cycle and Support.

Platform and versions

Older advice Current state Since Official source and site page

Development Cookbook and Masterclass target PHP 8.1 and database minimums of MySQL 5.7.8, MariaDB 10.3, PostgreSQL 12 and SQLite 3.26. One Masterclass example sets platform.php to 8.0.7, below the minimum of Drupal 10 itself.

Drupal 11 needs PHP 8.3 or later and runs on 8.3 to 8.5; Drupal 12 requires PHP 8.5. The database minimums are higher too, and Drupal 12 raises them again (the requirements page and the 12.0.0 beta release notes give different PostgreSQL values, so check both before choosing a server). Set platform.php to the PHP version of the production server, not to a value below Drupal’s own minimum.

11.0

PHP requirements and Database server requirements; Requirements and Hosting

Masterclass describes Drupal 11 as a future release and Drupal 7 as still supported. Development Cookbook treats Drupal 10 as the current line.

Drupal 11.0.0 was released on 2024-08-02 and Drupal 7 reached end of life on 2025-01-05. Drupal 10 ends on 2026-12-09, with 10.6 as its last minor, so a new site should start on 11.4. Drupal 12 refuses to upgrade from 11.2 or earlier; upgrade through 11.3 or later.

11.0

Drupal 11.0.0 release notes and How to upgrade from Drupal 11 to Drupal 12; Versions, Release Cycle and Support

Masterclass is written against Symfony 6.2.

Drupal 11 uses Symfony 7, and Drupal 12 moves to Symfony 8. Code that type-hints Symfony classes, subscribes to kernel events or extends Symfony Console commands must follow the major version of the release it runs on.

11.0

Drupal 12.0.0-beta1 release notes; Preparing for Drupal 12

The books assume Apache, nginx or IIS as equally valid hosts.

IIS support was removed in 11.0, and Windows production hosting is deprecated from 11.3. Use Apache 2.4.7 or later or nginx. From 11.3, a reverse proxy or CDN must also pass the HTMX request headers.

11.0

Drupal 11.0.0 release notes; Requirements and Hosting

Installation and project setup

Older advice Current state Since Official source and site page

Download a tarball, upload a module archive or install a module and theme from a URL in the administration interface.

Composer is the only supported way to add or update code. The pages that install an extension from a URL or an archive were removed in 10.4 and 11.0, and the user interface that updated modules and themes through authorize.php in 11.2. Automatic Updates and Project Browser build on the core Package Manager and still need a writable codebase.

10.4 and 11.0

Change record: The feature to install a new extension from a URL via the Drupal UI has been removed; Updates, Composer and Security Advisories

Install Drupal with the Standard profile and open the Article and Page content types.

From 11.4 the Standard install no longer creates the Article and Page content types. Create the types you need, or apply the matching core recipe. Tutorials that begin with the Article type need a first step that creates it.

11.4

Drupal 11.4.0 release notes; Recipes and Installation with Composer and DDEV

Start from drupal/legacy-project or pin Guzzle, Twig and the Symfony polyfills through drupal/core-recommended.

drupal/recommended-project is the template; drupal/legacy-project is abandoned in 11.4, and drupal/core-recommended no longer pins Guzzle, Twig or the Symfony polyfills. Sites should require what they use.

11.4

Using Composer to install Drupal and manage dependencies; Installation with Composer and DDEV

Development Cookbook uses DDEV with MariaDB 10.3 and the matching .ddev/config.yaml keys of 2023.

DDEV remains the recommended local environment, but the database type and version, the PHP version and the web server come from the current Drupal 11 quickstart. Create the project with ddev config --project-type=drupal11.

11.0

DDEV quickstart: Drupal; Project Layout and Local Development

Registration is open by default and /user/logout is a plain link.

New installs register users as "Administrators only" (11.1), /user/logout is CSRF-protected (10.3) and the super-user access of user 1 can be switched off with the security.enable_super_user parameter (10.3).

10.3 and 11.1

Change record: User logout route is now CSRF protected and Change record: Super user access policy; Security Hardening

Site building and content

Older advice Current state Since Official source and site page

Development Cookbook builds pages with Layout Builder; Masterclass presents Layout Builder as the only visual builder in core and treats Project Browser, Automatic Updates and recipes as future work.

Layout Builder stays in core, but Canvas (formerly Experience Builder, contributed, 11.3 or later) is the visual builder of Drupal CMS 2.x and renders Single Directory Components and JavaScript code components. Recipes shipped in 10.3, Drupal CMS followed in 2025, and Project Browser and Automatic Updates exist as contributed projects. Drupal CMS 2.0 has no automatic migration from Layout Builder or Paragraphs to Canvas, so decide per site.

10.3

Drupal Canvas documentation and Drupal CMS documentation; Canvas and Layout Builder

Recipes are an initiative still to come.

Recipes are in core since 10.3 and applied with drush recipe or php core/scripts/drupal recipe. A recipe has no update path: once applied, the site is ordinary Drupal and the recipe is not tracked.

10.3

Distributions and Recipes documentation; Recipes and Drupal CMS and Site Templates

Both books use the Statistics module for page counters and the Book, Forum and Activity Tracker modules as core features.

Actions UI, Activity Tracker, Book, Forum, Statistics and Tour were removed in 11.0, and Color, Quick Edit, RDF, Aggregator and HAL in 10.0. Before upgrading, install the contributed version of each removed module you use and do not uninstall it first.

10.0 and 11.0

Deprecated and obsolete modules and themes; Removed Core Modules and Replacements

Text format examples are written for CKEditor 4 in older tutorials and forum answers.

CKEditor 4 was removed in 10.0. Every editor page uses CKEditor 5, whose toolbar items, styles and plugins are configured differently. The books cover CKEditor 5, but tutorials from 2022 and earlier do not.

10.0

Change record: CKEditor 4 is removed from Drupal Core in 10.0.0; Text Formats and CKEditor 5

Administration interface

Older advice Current state Since Official source and site page

The administration bar is the Toolbar module, with Admin Toolbar as its usual extension.

The Navigation module became stable in 11.3 and is the navigation that remains in core in Drupal 12. Toolbar and Shortcut move to contrib in 12, so a site that uses them requires the contributed projects before upgrading and does not uninstall them.

11.3

Drupal 12.0.0-beta1 release notes; Admin UI, Navigation and Admin Themes

Claro is the administration theme and Olivero the front-end theme; Stable and Classy are the base themes.

Classy and Stable were removed in 10.0 (Starterkit replaces them). Default Admin, based on Gin, arrived as an experimental core theme in 11.4 and replaces Claro as the admin theme in Drupal 12, which also removes Olivero and Stable 9. Choose a base theme and a front-end theme with that in mind.

10.0 and 12.0

API reference: default_admin.info.yml; Admin UI, Navigation and Admin Themes

Migrations from Drupal 7 use Migrate Drupal and its UI.

Drupal 12 removes Migrate Drupal and Migrate Drupal UI with no contributed replacement, so a Drupal 7 migration must land on an 11.x site first and then be upgraded.

12.0

Drupal 12.0.0-beta1 release notes; Migrating from Drupal 7

Theming

Older advice Current state Since Official source and site page

Theme Development and Masterclass present Single Directory Components as an experimental module: enable sdc, use sdc/... library names and point $schema at a path under core/modules/sdc.

SDC is part of the core render system since 10.3. There is no module to enable, generated libraries are named core/components.<provider>--<component>, props uses JSON Schema and the schema is under core/assets/schemas/v1/. The experimental label is gone.

10.3

Using Single Directory Components; Single Directory Components

Theme Development says "Drupal 11 doesn’t exist yet" and targets PHP 8.1 and Starterkit from 10.1.0.

Starterkit remains the way to start a theme (php core/scripts/drupal generate-theme), but Drupal 11 is current and Olivero, Claro and Stable 9 leave core in 12, so generate from starterkit_theme and pick a base theme that survives. Stable 9 is deprecated in 11.4.

11.0

Starterkit theme; Starterkit and Subthemes

Theme code calls \Drupal:: services in .theme files and preprocess functions only live in THEME.theme.

Preprocess hooks can be class methods from 11.2 and themes support the other hooks as classes from 11.3, so a theme can keep its logic in src/Hook. Procedural .theme code is still valid and is the only choice for a theme that must run on 10.x.

11.2 and 11.3

Change record: Hooks in themes can now be OOP; Hooks and OOP Hooks

Libraries list core/jquery.ui widgets, use $(...).once() and rely on jQuery 3 and Backbone or Underscore.

jQuery UI is internal to core and is no longer a public library, once() replaces the jQuery plugin, Drupal 11 ships jQuery 4 and Backbone and Underscore are removed in 12.

10.0 and 12.0

Adding assets (CSS, JS) to a Drupal theme via libraries.yml; Libraries and Assets

Twig templates use {% spaceless %} and hand-written class lists.

The spaceless tag was removed from core templates in 11.1, and html_cva and html_classes from twig/html-extra arrived in 11.4. Autoescaping stays on, and |raw on user input is an XSS risk.

11.1 and 11.4

Filters - Modifying Variables In Twig Templates; Twig Templates and Debugging

Tailwind CSS 3 with a tailwind.config.js file, webpack, and Storybook with Twig.js.

Tailwind CSS 4 is configured in CSS, Vite is the usual bundler for Drupal, and the Storybook module renders real Twig through Drupal instead of Twig.js, which does not know Drupal filters and functions.

n/a

Theming Drupal; Front-End Tooling

Module development

Older advice Current state Since Official source and site page

Plugins are written with docblock annotations: @Block(...), @FieldFormatter(...), @Translation("..."), and a custom plugin type has an Annotation class.

Plugins use PHP attributes such as #[Block(...)] and #[ContentEntityType(...)]. Attribute discovery arrived in 10.2; all core plugin types support it from 11.2. Annotations still work but are deprecated: a plugin manager that provides only an annotation class stops working in Drupal 12, and core’s annotation parsing is scheduled for removal in 13.

10.2

Change record: Plugin implementations should use PHP attributes instead of annotations and Plugin API: Attribute-based plugins; Plugin API and Attributes

Hooks are functions in MODULE.module, discovered by name.

Hooks are methods marked with #[Hook('name')] on autowired classes in src/Hook. Ordering, removal and replacement attributes arrived in 11.2 and replace hook_module_implements_alter. Procedural hooks are collected only from the main module file in 12. hook_install, hook_uninstall, hook_schema, hook_requirements, hook_update_N and hook_post_update_NAME must stay procedural.

11.1

Change record: Support for object oriented hook implementations using autowired services; Hooks and OOP Hooks

Classes call \Drupal::service(), \Drupal::entityTypeManager() and \Drupal::config().

Inject services through the constructor. Core registers service aliases for autowiring (10.1), autowiring is enabled in core’s services files (10.2) and AutowireTrait lets controllers and forms be autowired. \Drupal:: belongs only in procedural code and tests.

10.1 and 10.2

Change record: Core services provide aliases for autowiring and Change record: AutowireTrait allows ContainerInjectionInterface classes to be autowired; Services and Dependency Injection

Entity queries run without an explicit access decision.

accessCheck() must be called explicitly on content entity queries, and Drupal 12 query objects are no longer serialisable. Pick accessCheck(TRUE) for user-facing results.

9.x

Change record: Access checking must be explicitly specified on content entity queries; Database API and Entity Queries

Settings forms read and write configuration in submitForm() and invent their own validation.

ConfigFormBase supports #config_target, so configuration schema constraints validate the form and save the value.

10.2

Change record: #config_target in ConfigFormBase; Form API

Testing and tooling

Older advice Current state Since Official source and site page

Development Cookbook uses PHPUnit 9.5 with @group, @covers and @dataProvider annotations.

Drupal 11 runs PHPUnit 11 with metadata as attributes (#[Group('...')], #[CoversClass(...)], #[DataProvider(...)]). Attribute support arrived in the Drupal test runner in 11.2, and PHPUnit 10 was dropped in 11.3. Drupal 12 moves to PHPUnit 12.5, which does not read annotations at all.

11.2

PHPUnit 11 manual: Attributes and PHPUnit in Drupal; Automated Testing

Drush commands are classes with @command and @option annotations registered in drush.services.yml; the books target Drush 12.

Drush 13 serves Drupal 10.2 and 11, Drush 14 serves 11.3 and 12. Commands use attributes (#[CLI\Command]) and autowiring, and drush.services.yml is gone since Drush 13. Install Drush per project with composer require drush/drush. drush deploy runs updatedb, config:import, cache:rebuild and the deploy hooks.

Drush 13

Drush: Writing commands and Drush: Deploy command for Drupal; Drush

Coding standards are described on the old drupal.org pages and checked with an older Coder release.

Standards moved to project.pages.drupalcode.org/coding_standards, and Coder 9 is the version for Drupal 12. Combine PHPCS with PHPStan and run them in CI.

n/a

Drupal coding standards and Coder project page; Coding Standards and Static Analysis

Headless and APIs

Older advice Current state Since Official source and site page

Theme Development builds a decoupled front end with the next-drupal Pages Router and getStaticProps.

Current Next.js guidance uses the App Router and NextDrupal, with draft mode and cache-tag revalidation instead of getStaticProps. JSON:API is core and needs no configuration; GraphQL 5.x and Simple OAuth 6.x are contributed, and Simple OAuth 6 removed the implicit and password grants.

n/a

Change record: Simple OAuth 6.0.x removes unrecommended grant types; Decoupled Drupal with Next.js and JSON:API

REST resources are the default way to expose content.

JSON:API is the recommended default for entity data; the REST module remains for custom resources and serialisation.

8.x

JSON:API vs. core’s REST module; REST and Serialization

AI is not part of the books.

The AI module supports many providers through the Key module, and the MCP Server module exposes a site over MCP. Keys never belong in exported configuration.

n/a

AI Module and Providers and MCP Server and AI Agents

Changed since older tutorials

The tutorials and books above share a short list of changes that account for most of what no longer works. Each is a pair of "you may read" and "do this now".

You may read Do this now

Annotations on plugins

Attributes on plugins (10.2, 11.2 for all core types)

Hooks in .module files

#[Hook] methods in src/Hook classes (11.1), with #[LegacyHook] to stay compatible with 10.x

drush.services.yml and @command annotations

Autowired command classes with attributes (Drush 13 and later)

PHPUnit docblock annotations

PHPUnit attributes (11.2 and later)

Experimental SDC module

SDC in core since 10.3, nothing to enable

Layout Builder as the only visual builder

Layout Builder in core, plus Canvas for Drupal CMS 2.x and new component-based sites

Toolbar module

Navigation module (stable in 11.3)

Claro admin theme

Default Admin (experimental in 11.4, the admin theme in 12)

Install modules from the administration interface

Composer, then optionally Project Browser or Automatic Updates

Standard profile creates Article and Page

Create content types yourself or apply a recipe (11.4)

Run Drupal on IIS

Apache or nginx (IIS removed in 11.0)

Generic warning signs in older tutorials

A tutorial is probably out of date when it:

  • targets Drupal 8, 9 or 10.0 and 10.1, PHP 7.x or 8.1, or Drush 8 to 12;

  • has you upload a module through /admin/modules/install or download a tarball;

  • uses .module hook functions with no mention of #[Hook], or plugin annotations with no mention of attributes;

  • shows a drush.services.yml, @command annotations or Classy and Stable as base themes;

  • installs the sdc module, or builds with the Toolbar, Claro and Layout Builder only;

  • describes CKEditor 4, the Statistics, Book or Forum modules as core, or Migrate Drupal as a long-term option;

  • tells you to use the Standard profile and then edit the Article content type.

When in doubt, check the date of the source against the timeline on Versions, Release Cycle and Support, search the change records for the feature, and confirm the fact in the official documentation below.