Install
To start a new Drupal project with version 8.9.0-beta3@beta:To update your site and all dependencies to the latest version of Drupal:
To update your site to this specific release:
Using Composer to manage Drupal site dependencies
Downloads
Release notes
This is a beta release for the final, long-term support minor version of Drupal 8. Beta releases are good testing targets for developers and site builders who are comfortable reporting (and where possible, fixing) their own bugs. Beta releases are not recommended for non-technical users, nor for production websites. More information on beta releases.
This minor release provides new improvements without breaking backwards compatibility (BC) for public APIs. There may be changes in internal APIs and experimental modules that require updates to contributed and custom modules and themes per Drupal core's backwards compatibility and experimental module policies.
Minor releases may include string changes and additions. Translators can review the latest translation status on localize.drupal.org.
Drupal 8.9 is the final minor release of the 8.x series. It is a long-term support (LTS) version, and will be supported until November 2021. It also provides the same public API as Drupal 9.0 aside from deprecated code. For more information on the upcoming Drupal 9 release, read the Drupal 9.0.0-beta1 release notes.
Important update information
For a full list of important changes since 8.8, also see the following:
Recommended PHP version increased
-
Drupal 8.9 runs on all PHP 7 versions; however, it is recommended to update to at least PHP 7.3. Only PHP 7.3 and 7.4 are supported by the PHP maintainers until Drupal 8.9's end-of-life in November 2021.
Database driver handling improvements
-
The default database is now checked when Drupal is updated to ensure it complies with the minimum version supported by the database driver. (Previously, this only happened during installation.) Updates will not proceed if the requirement is not met.
If you see an error about your database version when running
update.php
, ensure your database meets the minimum database requirements or install one of the legacy database drivers provided as contributed projects. -
Database drivers provided by modules can now be placed in
src/Driver/Database
. These drivers will be listed in the installer. Existing custom or contributed drivers do not need to make any changes and will continue to work as before.
Upgrade path changes
The Views configuration fixes previously applied as post-updates in #2846614: Incorrect field name is used in views integration for multi-value base fields are now applied at every Views save in order to resolve an upgrade path bug. The old configurations are now formally deprecated in 9.0.0 and will be removed from 10.0.0. For more information on the changes that introduced this in previous releases, see the related change records:
- Multi-value base fields in views no longer use an incorrect field name
- Drupal\node\Plugin\views\field\Path deprecated, Drupal\views\Plugin\views\field\EntityLink now provides this functionality
- Exposed filters can now limit which operator they expose
Updates and changes to dependencies
-
The Composer plugins provided by Drupal -- the scaffold plugin, the vendor hardening plugin, and the project message plugin -- are now compatible with Composer 2, and Drupal core now allows either Composer 1 or 2.
Additionally, Composer has been updated from 1.9.1 to 1.10.5, and other Composer components have received minor- and patch-level updates.
-
The
wikimedia/composer-merge-plugin
dependency has been removed because it is incompatible with Composer 2. It was deprecated in Drupal 8.8.0, and has not been used in core since that release. Any sites that have a separate requirement for this project should add it as a direct dependency. -
Drupal is now using proper stable releases for
behat/mink
(1.8.0) andbehat/mink-selenium2-driver
(1.4.0). -
Drupal 8.9's other PHP dependencies have been updated to the latest compatible minor and patch versions wherever possible. In particular:
- Laminas components have been updated to the latest patch versions.
- Guzzle has been updated from 6.3.3 to 6.5.3.
- Symfony components have been updated from 3.4.35 to 3.4.40, and various Symfony polyfills have been updated from 1.12.0 to 1.15.0.
- New Symfony polyfills have been added for PHP 7.2 and for
idn_to_ascii()
andidn_to_utf8()
functions. - Twig has been updated from 1.42.3 to 1.42.5.
asm89/stack-cors
has been updated from 1.2.0 to 1.3.0.- Pear libraries have received patch-level updates.
egulias/email-validator
has been updated from 2.1.11 to 2.1.17.- The
ypo3/phar-stream-wrapper
library has been updated from 3.1.3 to 3.1.4. - Other development dependencies have received patch- and minor-level updates.
-
jQuery has been updated from 3.4.1 to 3.5.1.
-
The
core/js-cookie
library (which was introduced in Drupal 8.9.0-beta1 as the forward-compatible replacement jquery.cookie) has updated its js-cookie dependency from version 2.2.1 to version 3.0.0-rc.0. A summary of the differences in 2.2.1 and 3.0.0-rc.0 can be found by reviewing js-cookie's release history. Code that interacts with js-cookie via the shim provided bycore/jquery.cookie
is not impacted by this change.Review the change record on js-cookie for more information.
Changes to coding standards
-
The development dependency
drupal/coder
has been updated from 8.3.7 to 8.3.9. New coding standards rules are now available with this update.php_codesniffer
has also been updated from 3.5.0 to 3.5.5. -
The
Drupal.Classes.ClassFileName
rule is now enabled in the core ruleset to ensure classes are named properly so that they can be autoloaded.
Other important bugfixes
- #3126003: Increased memory usage during install
- #3126923: HEAD is broken for Drupal 8.9 with PHP 7.0
- #2992631: Update report incorrectly recommends security releases for old minors when a security update is needed and a secure version of the old minor is also available
- #3125763: Hidden dependency on migrate_drupal from node module when only migrate.module is enabled
- #3130427: Fix upstream failing tests involving in oEmbed
- #3131388: Visiting the config translation listing of fields you get a WSOD
- #3134606: [backport] PHP Fatal error in 8.9.x / 9.0.x upgrade path
- #3120910: Sites with missing schema information can't update to 8.8.3+ - attempts to run all historical updates
Known issues
- #3120731: Incorrect "Drupal already installed" if any database settings are wrong or unsatisfactory
- #3090183: UPGRADE.txt only mentions migrating from Drupal 6 and 7, UPDATE.txt only mentions 8-8 updates
All changes since 8.9.0-beta2
- #3135629 by xjm, dww, DamienMcKenna: Follow-up hotfix for PHP 7.0 compatibility.
- #3136604 by lauriii, xjm, effulgentsia, justafish: Update to jQuery 3.5.1
- #3135629 by alexpott, dww, daffie, jungle, Rkumar, balsama, xjm, catch: Minimum MySQL version requirement is not confirmed when upgrading existing sites from Drupal 8 to Drupal 9
- #3119733 by Raunak.singh, Suresh Prabhu Parkala, daffie, bertboerland, Kristen Pol, xjm: COPYRIGHT.txt outdated
- Revert "Issue #3135629 by alexpott, dww, daffie, jungle, Rkumar, balsama, xjm: Minimum MySQL version requirement is not confirmed when upgrading existing sites from Drupal 8 to Drupal 9"
- #3135629 by alexpott, dww, daffie, jungle, Rkumar, balsama, xjm: Minimum MySQL version requirement is not confirmed when upgrading existing sites from Drupal 8 to Drupal 9
- #3134606 by greg.1.anderson, longwave, catch, Kristen Pol, jungle, alexpott: [backport] PHP Fatal error in 8.9.x / 9.0.x upgrade path
- #3134731 by jungle, jonathan1055, longwave, andypost: Update coder to 8.3.9
- #3133305 by quietone, xjm, daffie, benjifisher, longwave: Use \Drupal::VERSION to get the version in Migrate UI rather than hardcoding it
- #3135747 by alexpott, mondrake, jungle: assertStringContainsString() and related BC layer in 8.8.x does not work as expected
- #3131379 by daffie, Beakerboy, Lendude, alexpott: CONCAT_WS requires at least 3 arguments
- Revert "Issue #3133305 by quietone, daffie, xjm, benjifisher, longwave: Use \Drupal::VERSION to get the version in Migrate UI rather than hardcoding it"
- #3133305 by quietone, daffie, xjm, benjifisher, longwave: Use \Drupal::VERSION to get the version in Migrate UI rather than hardcoding it
- #3134676 by Lendude, Kristen Pol: Update CHANGELOG.txt from D8 to D9 or D‚àû
- #3131343 by mondrake, jungle, dww, catch: Replace assertions involving calls to in_array() with assertContains()/assertNotContains()
- #2946073 by claudiu.cristea, mpp, neclimdul, Berdir, idimopoulos, remkoklein: Node grant access check missing cacheable dependency on node
- #3135250 by xjm, dww: [8.9 only] Increase recommended PHP version to 7.3 prior to release
- #3126566 by greg.1.anderson, jungle, tedbow, hussainweb, Kristen Pol, alexpott: Allow Drupal to work with Composer 2
- #3133103 by longwave: InstallerCustomConfigDirectoryCreateTest has bad assertions
- #3101635 by mrinalini9, TylerMarshall, Kristen Pol: Update comments in taxonomy.es6.js to reflect taxonomy and not blocks
- #3116399 by catch, Kristen Pol: Place blocks .module file should not trigger a deprecation
- #3126906 by jungle, longwave, AndyF: MenuLinkContentTest.php is recognized as a binary file by git
- #3133604 by Berdir, dww: Dependency compatibility check in system doesn't check if version is defined
- #3113124 by B2F, Kristen Pol: Incorrect API example about default widget override
- #3134333 by xjm, longwave, ravi.shankar, daffie: Change Drupal\Tests\search\Functional\SearchSimplifyTest and Drupal\Tests\search\Functional\SearchTokenizerTest to kerneltests
- #3087465 by zuhair_ak, tim.plunkett, Kristen Pol: Move hook_views_ui_display_top_links_alter() to views_ui.api.php
- #3123211 by jungle, Kristen Pol: Replace usages of \Drupal::menuTree() with IoC injection
- #3126333 by longwave, mondrake, xjm, catch: Replace usage of the optional $canonicalize parameter of assertEquals(), that is deprecated
- #3134475 by Beakerboy, daffie: Avoid directly comparing string to blob in CommentIntegrationTest
- #3122112 by alexpott, longwave, jungle, hussainweb, catch, xjm, greg.1.anderson: Update dependencies for Drupal 8.9
- #3134318 by jungle, daffie, xjm: Enable phpcs rule Drupal.Classes.ClassFileName
- Revert "Issue #3122112 by longwave, alexpott, jungle, xjm: Update dependencies for Drupal 8.9"
- Revert "Issue #3126566 by greg.1.anderson, jungle, tedbow, hussainweb, Kristen Pol, alexpott: Allow Drupal to work with Composer 2"
- #3114122 by jungle, klausi, dww: ExceptionLoggingSubscriber should log 403 access denied reason
- #3121020 by dww, Kristen Pol: Move Update Manager XML test fixtures into a fixtures/release-history directory
- #2988309 by Krzysztof Domański, Berdir, hchonov: Ensure that all field types return TRUE on equals() for the same values
- #3106304 by huzooka, Wim Leers: Migrate: add mapping for editor module's editor_align and editor_caption filters
- #2907402 by Berdir, neel24, Wim Leers, damiankloip, tedbow: HAL normalization of file fields don't provide file entity id or file entity REST URL
- #3101891 by tim.plunkett, zrpnr: Allow layout plugins to define default values for column widths
- #3110620 by salah1, xjm, kiamlaluno: Documentation for ModuleHandler::invokeAll() says the method uses a PHP function that is not used anymore
- #3082602 by bnjmnm, Kristen Pol, longwave, catch: Remove transform rule from css_disable_transitions_test
- Revert "Issue #3134318 by jungle, daffie: Enable phpcs rule Drupal.Classes.ClassFileName"
- #3134318 by jungle, daffie: Enable phpcs rule Drupal.Classes.ClassFileName
- #3128746 by mondrake, longwave, Suresh Prabhu Parkala, ravi.shankar, dww, catch: [backport] Replace assertions involving calls to strpos() with more accurate string assertions
- #3122112 by longwave, alexpott, jungle, xjm: Update dependencies for Drupal 8.9
- #3107472 by ravi.shankar, alexpott, kishor_kolekar, jibran: DbDumpCommand should not hardcode the version string
- #3126617 by hansfn: Invalid HTML for Field UI in Help Topics module
- #3108006 by mondrake, longwave, ravi.shankar, alexpott: Replace assertInternalType() calls with dedicated methods
- #3131819 by jungle, mondrake, xjm, dww: Replace assertions involving calls to is_resource() with assertIsResource()
- #3131818 by jungle, mero.S, xjm: Replace assertions involving calls to is_object() with assertIsObject()/assertIsObject()
- #3128761 by Beakerboy, daffie, alexpott, xjm: Duplicate timestamp placeholder in statistics query
- #2980304 by dww, jrockowitz, Rithesh BK, Kristen Pol, andrewmacpherson, dorianwinterfeld, bnjmnm: Seven theme's details/summary focus style is broken/missing in some browsers
- #3131816 by Spokje, jungle, mondrake, xjm, longwave: Replace assertions involving calls to is_array() with assertIsArray()/assertIsNotArray()
- #3130438 by stefanos.petrakis, andypost, longwave: Inject page_cache_kill_switch service to LanguageNegotiationBrowser
- #3119279 by dww, Lendude, alexpott, lauriii: views-view-table.html.twig template directly uses details without render array and polyfills
- #3094067 by kishor_kolekar, Suresh Prabhu Parkala, jungle, dpi, xjm: Update missing @param and @return documentation and docs typehints for TypedDataInterface
- #3131817 by quietone, Suresh Prabhu Parkala, jungle, mondrake, daffie, xjm, catch: Replace assertions involving calls to is_numeric() with assertIsNumeric()/assertIsNotNumeric()
- #3131820 by jungle, mero.S, quietone, catch: Replace assertions involving calls to is_string() with assertIsString()/assertIsNotString()
- #3123253 by mondrake, Lal_, prabha1997, longwave, xjm, alexpott, jungle: Remove usage of AssertLegacyTrait::pass() from base test classes
- #3103090 by greg.1.anderson, alexpott, jungle, ravi.shankar, dww, Mile23, larowlan: Avoid re-scaffolding unchanged files (and printing scaffold file information over and over)
- #3131821 by jungle, longwave, xjm: Replace assertions involving calls to is_callable() with assertIsCallable()/assertIsNotCallable()
- Revert "Revert "Issue #3129074 by longwave, mondrake, Lal_, Suresh Prabhu Parkala, johnwebdev, jungle, kapilkumar0324: Refactor assertions that use return values in conditionals""
- #3115772 by saurabh.rocksoul, swatichouhan012, Wim Leers, alexpott: User::load calls should be avoided in classes, use dependency injection instead in jsonapi module
- #3103010 by AndrewsizZ, No Sssweat, jungle, Lendude, jshimota01: Machine Name needs further clarification
- #3124281 by emyu01: Multiple grammatical errors in docs of BasicAuth class in basic_auth module
- #3131258 by longwave, mondrake, dww, alexpott: Remove redundant $message from assertFile(Not)Exists and assertDirectory(Not)Exists calls
- #3111463 followup by dww: Fix line wrapping
- #3063694 by dhirendra.mishra, devoidfury, joachim: class docs for Url should give an overview of how to create one
- #3128069 by quietone: Capitalize name of book module in OverviewForm
- #3111463 by dww, benjifisher, xjm: Improve code documentation for \Drupal\update\ProjectSecurityData
- #3074064 by TR: LoggerChannelFactoryInterface documentation references non-existent class
- #3131474 by jungle, mondrake, alexpott: Replace assertions involving calls to array_search() with assertContains()/assertNotContains()
- #3126787 by jungle, mondrake, xjm, alexpott: [D8 only] Add forwards-compatibility shim for assertInternalType() replacements in phpunit 6&7
- #3120961 by dww, tedbow: Remove VERSION from update test modules that receive dynamic version numbers in tests
- #2978398 by ilya.no, iyyappan.govind, mcdruid, aleevas, quietone, joachim, alexpott, tvb, catch: UserPasswordResetTest extends PageCacheTagsTestBase unecessarily
- #3132745 by jungle, longwave, xjm, swatichouhan012, daffie: Fix Drupal.Array.Array.LongLineDeclaration coding standard for instances of the $modules test property
- #3100251 by Hardik_Patel_12, longwave: Several code comments have incorrect namespaces for classes or interfaces they reference
- #3020905 by kiamlaluno, johnwebdev: Remove the implementation example from the documentation for ModuleUninstallValidatorInterface::validate()
- #3122547 by dww, Kristen Pol, jungle: Fix duplicate word typos (the the, to to, etc) for test assertions
- #3132287 by jungle, dww, xjm: Fix wrong usages of {@inheritdoc}
- Revert "Issue #3129074 by longwave, mondrake, Lal_, Suresh Prabhu Parkala, johnwebdev, jungle, kapilkumar0324: Refactor assertions that use return values in conditionals"
- #3129074 by longwave, mondrake, Lal_, Suresh Prabhu Parkala, johnwebdev, jungle, kapilkumar0324: Refactor assertions that use return values in conditionals
- #3120910 by catch, tedbow, longwave, Pascal-, alexpott, Punyasloka: Sites with missing schema information can't update to 8.8.3+ - attempts to run all historical updates
- #3118726 by AndyF, lauriii, jungle, xjm, bnjmnm, catch, mradcliffe, effulgentsia: Upgrade to js.cookie 3
- #3126957 by Suresh Prabhu Parkala, jungle, Neslee Canil Pinto, Kristen Pol, xjm: Add missing curly brackets around @inheritdoc
- #3099528 by andrewmacpherson: Duplicate paragraph in Media Library help
- #3125763 by quietone, heddn, dww, benjifisher, Lal_, Neslee Canil Pinto, alexpott, mikelutz: Hidden dependency on migrate_drupal from node module when only migrate.module is enabled
- #3131223 by jungle, mondrake, longwave: Replace assertions involving calls to array_key_exists() with assertArrayHasKey()/assertArrayNotHasKey()
- #3131388 by penyaskito: Visiting the config translation listing of fields you get a WSOD
- #3128814 by longwave, jungle, dww, alexpott: Replace assert* involving count() and an equality operator with assertCount()
- #3130427 by jungle, longwave, xjm: Fix upstream failing tests involving in oEmbed
- #3131088 by Spokje, longwave: Replace assertions involving calls to file_exists with assertFileExists()/assertFileNotExists() or assertDirectoryExists()/assertDirectoryNotExists()
- #3125391 by Beakerboy, daffie: Connection::query() return types missing string
- #3130811 by mondrake, jungle, longwave, ravi.shankar: Remove redundant $message from assert(Not)InstanceOf calls
- #3131090 by longwave: Replace assertions involving calls to is_dir with assertDirectoryExists()/assertDirectoryNotExists()
- #3130396 by longwave, jungle, dww, mondrake: Replace assertions involving calls to is_file with assertFileExists()/assertFileNotExists()
- #3128575 by longwave, jungle, daffie: Replace assert*(*, is_null()) with assertNotNull()/assertNull()
- #3084078 by lauriii, alexpott, Jaesin: AdminNegotiator::determineActiveTheme() does not adhere to the interface
- #3101040 by reinchek, swatichouhan012, Vinodhini.E, ckrina, KondratievaS: Password confirm field gets the green focus ring cropped
- #3039296 by jungle, abhisekmazumdar, pandaski, tvb, dww, alexpott, init90: Fix examples in hook_install() and hook_uninstall()
- #3115987 by jungle, kiamlaluno, quietone: Rename the $instanceIDs property used from plugin classes to $instanceIds
- #3119278 by nterbogt, hansfn: Better messaging for locale batches
- #3127838 by Lendude: In MediaLibrary the 'save and insert' is nested in code when it doesn't have to be
- #2956556 by johndevman, daffie, Neslee Canil Pinto, dan.munn, aleevas, dubcanada, alexpott: class isn't set in FETCH_OBJECT when class_name isn't set
- #2992631 by dww, swatichouhan012, tedbow, jungle, xjm: Update report incorrectly recommends security releases for old minors when a security update is needed and a secure version of the old minor is also available
- #3084813 by dpi: Fix return typehinting for user_load functions
- #3120901 by longwave, Kristen Pol: Update deprecations from 8.8.4 to 8.8.5
- #3121885 by jungle, longwave, alexpott, cilefen: Update coder to 8.3.8
- #3121362 by jungle, Meenakshi.g, dww, xjm, alexpott, tim.plunkett: Fix duplicate word typos (the the, to to, etc.) for code comments
- #3070745 by AndyF, ravi.shankar, olli, tedbow, samuel.mortenson, droplet, alexpott: Off canvas filling up localStorage's quota, causing errors
- #3119924 by sinn: SelectPagerDefaultTest should not rely on default sorting order
- #2455465 by stefan.r, Darren Oh, cosmicdreams, longwave, benjy, alexpott: Add mod_php7 check to htaccess and remove php5 code
- #3127960 by Kartagis: Incorrectly put underscore in string
- #3126797 by mondrake, Berdir, longwave: [D8 only] Add forwards-compatibility shim for assertString(Not)ContainsString()replacements in phpunit 6&7
- #3124769 by Chi, msuthars: Fix hardcoded destination in UiHelperTrait::drupalLogout()
- #3119922 by sinn, daffie: DeleteTruncateTest should not rely on default sorting order in DB
- #2997748 by amateescu, maseyuk, vijaycs85, daffie: Views query alter for fields stored in dedicated tables is not working properly
- #3126694 by Neslee Canil Pinto: Replace tpl.twig with html.twig in ThemeTest
- #3126695 by mondrake: [D8 only] Add forwards-compatibility shim for assertEqualsCanonicalizing() in phpunit 6&7
- #3127013 by jungle, greg.1.anderson, catch, Mixologic, andrey.troeglazov, andypost, Mile23: Remove wikimedia/composer-merge-plugin
- #3078524 by huzooka, kostyashupenko, thalles, katrienc, pranav45, neelam_wadhwani, prabha1997, ckrina, emma.maria, Maithri Shetty, Meenakshi.g, pminf, shimpy, fhaeberle, KondratievaS, Vinodhini.E, lauriii, cedric_a, bnjmnm, mradcliffe, DyanneNova, katannshaw: Focus styling of WYSIWYG field inputs should be consistent with other inputs
- #3126940 by Beakerboy, daffie: New DB URI breaks if an existing query part is missing the new module parameter
- #3126784 by quietone, jungle: \Drupal\ban\Plugin\migrate\destination\BlockedIP is not identical with its filename BlockedIp.php
- #3074047 by Neslee Canil Pinto, mikelutz, quietone: Update MigrateDestinationInterface::import return type documentation
- #3126923 by daffie: HEAD is broken for Drupal 8.9 with PHP 7.0
- #3120096 by alexpott, daffie, effulgentsia, Neslee Canil Pinto, xjm, mondrake, catch, ravi.shankar: Support contrib database driver directories in a fixed location in a module
- #3126003 by tedbow, alexpott, pfrenssen, lauriii: Increased memory usage during install
- Revert "Issue #3120096 by alexpott, daffie, effulgentsia, Neslee Canil Pinto, xjm, mondrake, catch, ravi.shankar: Support contrib database driver directories in a fixed location in a module"
- #2989745 by plach, jungle, alexpott, Lendude, catch, tim.plunkett: views_update_8500() inlines configuration changes instead of this being done on config save for bc
- #3107243 by kishor_kolekar, Kartagis, prabha1997, Neslee Canil Pinto, jungle, kiamlaluno, longwave, pandaski, alexpott, catch: Fix punctuation in link.schema.yml label
- #3016814 by jhedstrom, peximo, alexpott, jungle, scuba_fly, mr.baileys, FrancescoQ, cgoffin, Petr Illek, fabio84: Don't trigger hook_file_download when no file is requested
- #3030989 by Lendude, emyu01, ravi.shankar, nisha_gupta, kaszarobert: Error while trying to bulk delete already deleted nodes
- #3123653 by emyu01, naresh_bavaskar: Grammatical error in function description in views module