Install
To start a new Drupal project with version 10.2.0-beta1@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 next minor (feature) release of Drupal 10. Betas 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 improvements and new functionality. It does not not break backward compatibility (BC) for public APIs.There may be changes in internal APIs and experimental modules. If so, contributed and custom modules and themes may need updating. This is according to Drupal core's backward compatibility and experimental module policies.
This release may include string changes and additions. Translators can review the latest translation status on localize.drupal.org.
Drupal 10.2.x contains new features, and should be the target for new site development. Drupal 10.1.x will continue to have security support until June 2024.
Drupal 9.5.x security coverage ended on November 1, 2023. Sites on Drupal 8 or Drupal 9 should upgrade to a supported release as soon as possible.
Important update information
Symfony components have been updated from 6.4.0-BETA1 to 6.4.0-RC1. Additionally, Drupal core's minimum stability requirement has been re-increased from beta to rc.
A new index is added to the forum_index table to make it compatible with the recommended READ-COMMITTED transaction isolation level.
Filter formats are now consistently sorted. Exported filter format configuration may need re-exporting after updating, but afterwards they will remain consistent.
Drush versions below 12.4.3 are incompatible with Drupal 10.2.x
If you use Drush, you will need to upgrade to version 12.4.3 or greater.
Sites must update to at least Drupal 9.4.4 before upgrading to Drupal 10
Drupal sites running 9.3.x or earlier versions must first update to 9.4.4 or later before updating to Drupal 10. All core updates added before 9.4.0 have been removed. The data upgrade path from CKEditor 4 to CKEditor 5 is not available before Drupal 9.4.4. In general, sites should update to the most recent release of their current major branch before updating to the next major release.
Sites using CKEditor 4 should upgrade to CKEditor 5 in Drupal 9.4 or 9.5 before updating to Drupal 10
Most Drupal sites using CKEditor 4 should upgrade to CKEditor 5. See the recommendations for CKEditor for details. Upgrading from CKEditor 4 to 5 is a manual process. You must review each text format editor condition.
Upgrading from Drupal 6 and 7
Drupal 6 and 7 users can continue to migrate to Drupal 10.2. The migration paths from Drupal 6 and Drupal 7 to Drupal 10 will remain supported throughout Drupal 10's release cycle.
Changes to site-owner-managed files
- It is now recommended to enable output buffering in php.ini. This allows cleanup operations to run in the background after sending output to the browser.
New features
- Media entities now have a new tab for viewing, reverting and deleting revisions.
- CKEditor 5 now provides advanced formatting for tables and table cells when used in Full HTML (or Full HTML-like) text formats. The “Show blocks" button from CKEditor 4 has also been reintroduced to CKEditor 5. HTML comments are also now correctly preserved in CKEditor.
- An “add child" link has been added to menu item and taxonomy term operations dropbuttons, to make adding child items easier.
- Filename sanitization can now be configured in the user interface.
- Block visibility can be configured based on the HTTP response code.
- Plugin types can now use PHP attributes instead of annotations. Additionally, plugin implementations should start to convert from annotations to attributes once the plugin type supports attributes.
- Services that provide event subscribers can now be autoconfigured, reducing boilerplate in service definition files.
- Many controllers can now use auto-wiring for dependency injection instead of adding a
::createmethod. - The field storage configuration form is now rendered as a subform within the main field configuration form. This adjustment streamlines the configuration process, making it more intuitive and user-friendly.
- The filter system has been upgraded to output HTML5. HTML output will have minor changes in some cases.
- A new #config_target property has been added to Form API to make it easier to add validation constraints to configuration forms.
- DeprecationHelper::backwardsCompatibleCall
() allows contributed modules to support multiple versions of Drupal core more easily.
API deprecations and behavior changes
hook_image_style_flushis now invoked ifImageStyle::flush()is called with the$pathparameter set. Previously, the hook was only called if no path was passed to this method. The path parameter is also passed along to the hook implementation.- Views now require labels when created programmatically. The UI already required labels so there is no change for site builders.
- Kernel and functional tests now perform stricter config schema validation, which may lead to discovering incorrect configuration was being used in some tests.
- Entities may now provide a “collection permission" to allow access to the entity listing page.
Permissions changes
- Rebuilding node permissions now requires the
administer nodespermission. Previously only theaccess administration pagespermission was required. Site owners should review and adjust permissions as necessary to ensure proper access to the rebuild permissions functionality.
Performance improvements
- A new VariationCache API has been added. Users of the Variation cache contributed module should review whether it is still required.
- Drupal core install profile shipped image styles now convert to webp, this will be effective for new installations. Site owners may want to consider adding a webp conversion step to their own image styles.
- Drupal now sets a Content-Length header for most responses.
- PHP fibers are now used in the default and Big Pipe rendering systems.
Experimental modules
- The Announcements Feed module has been promoted from experimental to stable.
- The Experimental Help Topics module has moved to stable and been merged into the existing Help module. An update path will uninstall the Help Topics module and it should no longer be used.
Platform requirements changes
Drupal now supports PHP 8.3 and recommends at least PHP 8.2.
PHP dependency updates
Drupal core's pinned Composer dependency versions have been updated for the latest minor and patch releases. Additionally, Drupal core’s composer constraints increased to require the latest minor version. This supports forward compatibility and non-disruptive security updates.
Symfony components have been updated to version 6.4.
Symfony Mailer has been added as a new dependency, with the aim of replacing the existing mail system in a future release.
OpenTelemetry has been added as a development dependency in order to provide ongoing performance testing of Drupal core.
Frontend (CSS and JavaScript) production dependency changes
Drupal core's JavaScript dependencies have been updated. The latest minor versions of all JavaScript dependencies are now required by core yarn constraints.
CKEditor 5 has been updated to v40.1.0.
Development dependencies
Two new development dependencies provide GitLab-compatible output for ESLint and Stylelint.
Theme system and template changes
Stable 9 form elements now have form-type-[form-element-type] class.
Changed coding standards
- The rule
Drupal.Semantics.FunctionTriggerErrorhas been enabled.
Known issues
Search the issue queue for known issues.
All changes since Drupal 10.2.0-alpha1
- Issue #3402955 by quietone, Spokje: Update drush conflict to "<12.4.3"
- Issue #3400302 by poker10, longwave, nterbogt: PHP OPcache bug detection issue
- Issue #2600558 by marvil07, a_thakur, vsujeetkumar, alexpott, smustgrave, quietone, xjm: Wrong path generated in README.txt in sync directory
- Issue #3395977 by fjgarlin, smustgrave, mstrelan, mondrake: Test-only changes reverts changes to test modules
- Issue #3370560 by quietone, bogdog400, daffie: Update failed: dblog_update_10101 (TINYINT)
- Issue #3400762 by simohell, peterbihari, amanire: Long string breaks the layout of Claro
- Issue #3351458 by dburiak, Mingsong, Mahima_Mathur23, sthomen, smustgrave, catch, alexpott: [regression] Language switcher block returns links to node on the frontpage
- Issue #3392200 by jeremy_p, joachim, hdnag, yepa: Invalid placeholder error message should say what's wrong with it
- Issue #3402604 by alexpott, larowlan, catch, Spokje: SettingsTrayBlockFormTest::testBlocks() fails locally 100% of the time and lots of times on Gitlab CI
- Issue #3401753 by BramDriesen: Add Announcements Feed to the Standard profile
- Issue #3356488 by BramDriesen, xjm, catch, fjgarlin, hestenet, longwave, larowlan, alexpott, lauriii: Mark Announcements Feed as stable
- Issue #3390693 by mikelutz, smustgrave: MigrationPluginManager::ExpandPluginIds can lose derivative plugins under certain circumstances
- Issue #3394741 by acbramley, jenlampton, smustgrave: BlockContentAccessControlHandler requires access block library permission for update, delete and revisions operations
- Issue #3402548 by alexpott, mikelutz, el7cosmos: YamlFileLoaderTest fails if you have PECL yaml installed
- Issue #3391786 by quietone, xjm, smustgrave: Fix spelling of words only misspelled in tests, variable names, part 5
- Issue #3401971 by fjgarlin: Test-only job shouldn't require constant rebases to detect which files were changed
- Issue #3402168 by Wim Leers, alexpott, Berdir, bircher, borisson_, effulgentsia: Follow-up for #3361534: Config validation errors can still occur for contrib modules, disrupting contrib
- Issue #3400458 by alexpott, Berdir, longwave, ReINFaTe, mglaman, larowlan, Charlie ChX Negyesi, kristiaanvandeneynde, cmlara: AttributeClassDiscovery fails while trying to include non valid plugin class
- Issue #3347721 by Wim Leers, dabley, lauriii, smustgrave, witeksocha, Reinmar, thatipudir: [Style] Warn the user about styles for unsupported elements
- Issue #3401720 by neclimdul, acbramley: [random test fail] TimestampFormatterWithTimeDiffViewsTest::testTimestampFormatterWithTimeDiff
- Issue #3401764 by BramDriesen, xjm, smustgrave: Replace CollegeHumor URLs and logic in core test cases
- Issue #3175449 by mfb, super_romeo, smustgrave, _pratik_, Medha Kumari, Nitin shrivastava, quietone, alexpott, xjm, dagmar, longwave: Display backtrace for logged throwables on log message details page
- Issue #3380239 by smustgrave, pradhumanjain2311, FlusteredLondon, xjm, joachim, cilefen: Date token descriptions are confusing
- Revert "Issue #3383131 by WalkingDexter, xjm, allisonherodevs, ashley_herodev, pradhumanjain2311, smustgrave, marcoliver, lauriii: Entity autocomplete form element ignores entities with label "0""
- Issue #3316274 by Wim Leers, catch, nod_, alexpott, longwave, bnjmnm: Stabilize FunctionalJavascript testing AJAX: add ::assertExpectedAjaxRequest()
- Issue #3401971 by fjgarlin: Test-only job shouldn't require constant rebases to detect which files were changed
- Issue #3397890 by mstrelan, dww: Fix strict type errors in unit tests
- Issue #3383131 by WalkingDexter, xjm, allisonherodevs, ashley_herodev, pradhumanjain2311, smustgrave, marcoliver, lauriii: Entity autocomplete form element ignores entities with label "0"
- Issue #3398400 by pradhumanjain2311, joachim, smustgrave: Clean up repeated method calls in ValidReferenceConstraintValidator
- Issue #3396153 by joachim: Composer Scaffold plugin README is incomplete
- Issue #2904899 by FeyP, idflood, smustgrave, alexpott: Invalid argument exception when changing language of node with menu link to und or zxx
- Issue #3401901 by Spokje, smustgrave, longwave: Update composer dependencies for Drupal 10.2 beta
- Issue #3399992 by mstrelan, smustgrave, xjm: Fix strict type errors in test traits
- Issue #3401236 by pradhumanjain2311, xjm, joachim, smustgrave: Rename EntityReferenceTestTrait to help discoverability
- Issue #3390692 by catch, xjm, smustgrave: Split out a couple more config translation UI tests
- Issue #3400368 by Wim Leers, xjm, borisson_, catch: Deprecate path.temporary in system.file configuration schema
- Issue #3399754 by mstrelan, smustgrave, xjm: Fix strict type errors in functional JavaScript tests
- Issue #3400791 by Spokje, Wim Leers: Update CKEditor 5 to 40.1.0
- Issue #3377310 by catch, joelpittet, mark_fullmer, smustgrave, TrevorBradley, bkosborne, MWaters, cilefen, capellic: 400 exceptions result from requests for old asset paths which are missing the "theme" query string, possibly from cached pages
- Issue #3401102 by Spokje, longwave, smustgrave: Nightwatch artifacts on GitLab not retained
- Issue #3391681 by longwave: Use default section to simplify GitLab pipelines
- Issue #3385283 by e0ipso, smustgrave, idiaz.roncero, jldust, wotnak: Components without props throw error
- Issue #3397291 by Utkarsh_33, rkoller, smustgrave: Improve the readability of the view mode and form mode page
- Issue #3401186 by Wim Leers, alexpott: Follow-up for #3382510: Throw \LogicException when >1 #config_target in the same form targets the same property path
- Issue #3397173 by Spokje, smustgrave: Convert both BookNavigationCacheContext and MenuActiveTrailsCacheContext to use lazy services
- Issue #3398982 by Wim Leers, phenaproxima, alexpott, borisson_: ConfigFormBase + validation constraints: support non-1:1 form element-to-config property mapping again
- Issue #3387959 by poker10: Document new arguments in run-tests.sh
- Issue #3400485 by googletorp, nod_: LibraryDependencyResolver::getMinimalRepresentativeSubset() calculates dependencies incorrectly
- Issue #3277238 by lauriii, xjm, plopesc, quietone, andregp, Berdir, smustgrave, hmendes, joachim, alexpott, fjgarlin: Fix \Drupal\taxonomy\Entity\Term::getName() to conform to the interface
- Issue #3015369 by quietone, mikelutz, xjm: Fix MigrateTestBase::executeMigrations() to execute migrations in dependency order
- Issue #3401200 by quietone: Update composer dependencies for Drupal 10.2 beta
- Issue #3365945 by larowlan, sakthi_dev, alexpott, catch, daffie, mkimmet, Olarin, rakesh.gectcr, JvE, borisson_, eelkeblok: Errors: The following table(s) do not have a primary key: forum_index
- Issue #3377000 by Spokje, longwave, xjm: Remove phpstan ignore for "#^Missing cache backend declaration for performance.#"
- Issue #3395563 by nireneko, marvil07, lauriii, borisson_, smustgrave, Wim Leers: Add validation constraints to taxonomy.settings
- Issue #3379495 by quietone, xjm, smustgrave: Convert enable/disable to install/uninstall in hook_help()
- Issue #3195583 by smokris, smustgrave, mohit.bansal623, xjm, quietone: Fix warning when RSS feed includes markup with an empty srcset attribute
- Issue #1215784 by Saphyel, jenlampton, penyaskito, jlscott, simohell, sanjusci, StephaneQ, jeffschuler, scresante, droplet, Shivam Agarwal, xjm, jbrown, alexpott, quicksketch, Gábor Hojtsy, smustgrave, ianthomas_uk, TR, bleen, nlisgo, catch: Terminology update: don't say "Resolution" when we mean "Dimensions"
- Issue #3383692 by Murz, xjm, smustgrave: Document that NULL is an allowed return value for EntityRepositoryInterface::getTranslationFromContext()
- Issue #3400045 by kristiaanvandeneynde, lauriii, moshe weitzman, xjm: Offering to co-maintain the User subsystem
- Issue #3400806 follow-up by lauriii, rkoller: Text color changes on hover for elements with .buttons
- Issue #3017054 by alexpott, deviantintegral, percoction, mattwith, ankithashetty, Wim Leers, jwilson3, longwave, bircher: Consistently sort filter formats to simplify config exports
- Issue #3397581 by Spokje: Remove ContainerAware classes from RenderPlaceholderMessageTestController
- Issue #3342874 by star-szr, Wim Leers, DamienMcKenna: Allow inline HTML comments in CKEditor 5
- Issue #3399685 by poker10, greggles, BramDriesen: Remove Core version from install.php when the site already is installed - Information Disclosure - Leaking version information
- Issue #3301205 by Spokje, mondrake, Gábor Hojtsy, quietone, catch, xjm: Replace the test class protected $modules deprecation error with a phpstan-drupal rule
- Issue #3400071 by Spokje: Update cspell to latest version (major bump)
- Issue #3395891 by quietone: Fix spelling for words in test modules
- Issue #3398946 by Spokje: Upgrade glob to latest possible version working with yarn 1.*
- Issue #3328741 by quietone, smustgrave, xjm, catch, alexpott, longwave: Add a dictionary for Drupal-specific words
- Issue #3393955 by quietone, xjm, smustgrave: Correct $suggestions documentation in hook_theme_suggestions_alter()
- Issue #3385837 by vbouchet: PathContentModerationTest should use API to set up language
- Issue #3384935 by vbouchet: ContactLanguageTest should use API to set up language
- Issue #3385811 by vbouchet: ContentTranslationUntranslatableFieldsTest should use API to set up language
- Issue #3385834 by vbouchet, joachim: MenuUiNodeTest should use API to set up language
- Issue #3379819 by kim.pepper, smustgrave, RoSk0: Display the deployment_identifier on the status page
- Issue #3374537 by camoa, Utkarsh_33, TY4DVenom, Gauravvvv, Indrapatil, narendraR, Harish1688: PostCSS layout helpers inconsistency
- Issue #3355603 by roshni27, joachim, Ranjit1032002, quietone: Docs for ImageFieldCreationTrait and FileFieldCreationTrait are misleading
- Issue #3399370 by mstrelan: Remove @file annotation from test classes
- Issue #3397991 by dineshkumarbollu, joachim: Error in EntityFieldManager comment
- Issue #3391788 by quietone, xjm: Fix spelling of function names in tests
- Issue #3341669 by jennakoo, royalpinto007, ThomWilhelm, Gauravvvv, athyamvidyasagar, nayana_mvr, kunal_sahu, Nishant, idiaz.roncero, OhJoz, smustgrave, Laurie Lim: Dropbuttons and regular buttons are misaligned
- Issue #3210684 by joachim, mikran, tobiasb: Put each entity type table into a details element on admin/config/regional/content-language
- Issue #3381078 by mfb, smustgrave, xjm, quietone, andypost: Demote routine log events from "notice" to "info"
- Issue #3400806 by OhJoz, jennakoo: Text color changes on hover for elements with .buttons
- Issue #3397742 by lauriii, smustgrave: Improve machine name AJAX focus handling integration
- Issue #3400318 by kim.pepper: Skip SettingsTrayBlockFormTest::testEditModeEnableDisable due to random fails
- Issue #3400315 by kim.pepper, smustgrave: Skip TimestampFormatterWithTimeDiffTest::testTimestampFormatterWithTimeDiff due to random fails
- Issue #2960381 by roshni27, joachim, apaderno, smustgrave: Docs for FactoryInterface::createInstance() and MapperInterface::getInstance() are too similar and need more detail
- Issue #2272637 by mohit_aghera, ashley_herodev, ankithashetty, Gauravvvv, malc0mn, pooja saraah, catch, Abhijith S, smustgrave, xjm, bnjmnm, larowlan, dcam, ameymudras: Default file visibility setting not respected
- Issue #3348789 by catch, Altcom_Neil, markie, lauriii, pelicani, longwave, olli: Compress ajax_page_state
- Issue #3400313 by kim.pepper, catch: Skip KeyValueStore\DatabaseStorageTest due to random test failures
- Issue #3400041 by kristiaanvandeneynde: Offering to co-maintain the cache subsystem
- Issue #3400311 by kim.pepper: Skip AjaxTest::testAjaxFocus() due to random test failures
- Issue #3397594 by Utkarsh_33, lauriii: Race condition on AJAX change event and form submission
- Issue #2898274 by aleevas, piotrkonefal, borisson_, GaëlG, ankithashetty, dietr_ch, robpowell, alexpott: Uninstalled custom theme stuck in config blocking config import
- Issue #3399419 by quietone: Update mglaman/phpstan-drupal to 1.21 for 3301205
- Issue #3399172 by saidatom, smustgrave: Fix linting issues in Twig files
- Issue #3398891 by alexpott, Wim Leers: Do not require the config in #config_target to be listed in getEditableConfigNames()
- Issue #2911977 by yash.rode, acbramley, bnjmnm, smustgrave, phenaproxima, Wim Leers, chr.fritsch, larowlan: Add Media revision UI
- Issue #3395852 by makbay, smustgrave, cilefen: Update the countries list to latest Unicode CLDR version 44
- Issue #3397488 by nbeaucage, longwave, smustgrave, catch: Deprecate unused CacheDecoratorInterface
- Issue #3399295 by alexpott, Wim Leers, bircher, andypost, borisson_: Allow all callables in ConfigTarget
- Issue #3399123 by Spokje, longwave, smustgrave: Upgrade JavaScript dependencies to latest minor/patch releases
- Issue #3399333 by andypost: All Lint jobs should use same default variables
- Issue #3398974 follow-up by Wim Leers: Follow-up for #3382510: FormStateInterface::setErrorByName() needs not #name but a variation
- Issue #3395586 by andy-blum, deviantintegral, longwave, catch: Add Symfony's Filesystem and Finder components to core
- Issue #3398974 by alexpott, Wim Leers, borisson_: Follow-up for #3382510: FormStateInterface::setErrorByName() needs not #name but a variation
- Issue #2441373 by twistor, vsujeetkumar, marvil07, eporama, daffie, joseph.olstad, alvar0hurtad0, jibran, longwave, joelpittet, smustgrave, alexpott: Upgrade tests to HTML5
- Back to dev.