Drupal 9 — девятая мажорная версия Drupal, релиз которой состоялся 4 июня 2020. Это первый мажорный релиз Drupal, в котором ядро не подверглось серьезным ломающим изменениям и процесс обновления с предыдущей мажорной версии, Drupal 8, производится максимально просто и гладко.
¶Что нового в Drupal 9?
Drupal 9 продолжает начатое в Drupal 8 — ядро будет развиваться постоянно через минорные релизы, будут появляться новые модули и API, старые возможности будут либо улучшаться, либо выводиться из оборота.
Фактически, Drupal 9.0 является точной копией Drupal 8.9, за одним лишь важным исключением — весь код что был помечен @deprecated
в Drupal 8, полностью удалён в Drupal 9. Также были обновлены все важные зависимости ядра, такие как Symfony, jQuery, CKEditor, Twig, Guzzle и т.д.
Ввод новых возможностей начнётся только с Drupal 9.1.
¶Значимые изменения в Drupal 9
В этом разделе описаны значимые изменения, произошедшие за время поддержки Drupal 9. Помимо перечисленных ниже, было множество других не менее интересных и полезных изменений. Вы можете ознакомиться с ними на соответствующих страницах минорных релизов:
- Список изменений Drupal 9.0.0
- Список изменений Drupal 9.1.0
- Список изменений Drupal 9.2.0
- Список изменений Drupal 9.3.0
- Список изменений Drupal 9.4.0
¶Разработка новой экспериментальной темы Olivero
Начиная с релиза Drupal 9.1.0 появилась новая экспериментальная тема оформления Olivero.
Данная тема оформления создаётся на замену текущей — Bartik, которая прослужила Drupal не один мажорный релиз.
Olivero создаётся с использованием современных возможностей CSS, современным визуальным оформлением и улучшенной поддержкой A11Y.
¶Рефакторинг Database API
Database API во многих минорных релизах подвергался различным изменениям и улучшениям. Все эти изменения были направлены на улучшение DX.
Наиболее заметные изменения:
- В Drupal 9.1.0
Connection::prepareQuery()
иConnection::prepare()
объявлены устаревшими и получили заменыConnection::prepareStatement()
иPDO::prepare()
соответственно. - В Drupal 9.1.0 был добавлен новый класс
StatementWrapper
, аDrupal\Core\Database\Connection::$statementClass
объявлен устаревшим. - В Drupal 9.2.0 передачу
StatementInterface
объектов вConnection::query()
объявили устаревшей. - Начиная с Drupal 9.2.0 все идентификаторы в запросах должны оборачиваться в квадратные кавычки (
[]
). - В Drupal 9.2.0 добавлен новый статический метод
Drupal\Core\Database\Log::removeDatabaseEntries()
, при помощи которого вы можете очищать обратный стэк вызовов от ненужной информации о БД. - В Drupal 9.2.0 был представлен новый класс
ExceptionHandler
, который позволяет обрабатывать исключения связанные с драйверами БД. Ранее для этого использовался внутренний методConnection::handleQueryException
, который в этом изменении объявили устаревшим. - Начиная с Drupal 9.2.0 необходимо явно указывать необходимость проверки прав доступа к результатам запроса Entity Query.
- В Drupal 9.4.0 добавили новый метод
Connection::lastInsertId()
, которая возвращает ID последней успешно записанной строки в БД. Ранее для этого использовались костыли! - Начиная с Drupal 9.4.0 драйвера баз данных, предоставляемых Drupal получили свои одноимённые модули.
- В Drupal 9.4.0 расширения для построения
SELECT
запросов стали управляться при помощи фабрик.
¶Продолжена замена API функций сервисами
Drupal предоставляет множество API функций, часть из которых тянется из более ранних версий. Некоторые из этих функций получили новую жизнь в виде сервисов, например:
- В Drupal 9.1.0 функция
user_password()
была заменена сервисомpassword_generator
. - В Drupal 9.3.0 функции
file_create_url()
иfile_url_transform_relative()
заменены новым сервисомfile_url_generator
. - В Drupal 9.3.0 были объявлены устаревшими функции
drupal_get_path()
иdrupal_get_filename()
. - В Drupal 9.3.0 была объявлена устаревшей функция
file_build_uri()
. - В Drupal 9.3.0 функцию
_file_save_upload_single()
заменили сервисомfile.upload_handler
. - В Drupal 9.3.0 функции
file_save_date()
,file_copy()
иfile_move()
объявлены устаревшими в пользу сервисаfile.repository
. - В Drupal 9.4.0 объявили устаревшей фукнцию
module_load_include()
. - В Drupal 9.4.0 объявили устаревшей функцию
module_load_install()
.
¶Начато постепенное прекращение использования jQuery UI и jQuery
Drupal, наверное, всегда использовал эти библиотеки для своих целей. Начиная с Drupal 9 их постепенно начали выводить из оборота. JavaScript становится более зрелым языком и теперь имеет многие, а то и большинство возможностей из тех, что предоставлял jQuery или jQuery UI. А та часть, что до сих пор не имеет аналогов в нативном JavaScript заменяется более лёгкими и точечными библиотеками.
Конечная цель данных изменений — разгрузить фронтенд сайта и позволить разработчикам иметь больше контроля над тем, какие библиотеки попадают на фронтенд. Ведь даже сейчас, хочет разработчик или нет, вероятность что будет загружен jQuery стермится к 100%. Ведь даже минимизированная версия jQuery весит ~87кб! Учитывая для каких задач используется данная библиотека, это невероятно бесполезный файл.
¶Написана и добавлена в ядро собственная JavaScript библиотека drupal/once
В Drupal активно используется подход в JavaScript, который позволяет контролировать количество регистраций тех или иных событий для элементов. А именно, следить, чтобы одно и то же событие не было зарегистрировано дважды на один элемент. Для этих задач раньше использовалась библиотека jQuery Once.
Начиная с Drupal 9.3.0 добавлена собственная библиотека drupal/once
, которая делает ровно тоже самое, только без необходимости в jQuery, что ускоряет её работу и снижает нагрузку на клиента.
Вы можете узнать о ней больше на её личной странице Drupal JavaScript Once API.
¶Бандлы получили поддержку собственных классов
В Drupal 9.3.0 была добавлена очень полезная возможность — теперь бандлам сущности можно указывать собственные классы.
Ранее, сущности имели свои собственные классы, но их бандлы (подтипы) всегда представляли собой общий класс сущности. Теперь каждому конкретному типу можно указать свой собственный класс, который расширяет класс сущности. Это позволяет типизировать аргументы в коде, а также добавлять семантические методы, которые не только упрощают доступ к данным и сокращают код, но и позволяют объявлять их в зависимости от контекста (типа), чтобы каждый раз не вспоминать, поддерживает ли данный бандл это поле или нет.
¶Начата разработка модуля CKEditor 5
Drupal использует редактор CKEditor 4 начиная с Drupal 8. Данная версия уже устарела и требует замены. В связи с этим, начиная с Drupal 9.3.0 в ядро был добавлен новый экспериментальный модуль CKEditor 5 с обновлённым редактором.
¶Компоненты Symfony были обновлены до 5 версии
Drupal активно использует компоненты Symfony начиная с Drupal 8. Drupal 9 начал свою историю с Symfony 4.4. В релизе Drupal 9.3.0 начали частичное обновление компонентов, а в Drupal 9.4.0 обновили все компоненты до версии Symfony 5.4.
Это позволит как Drupal, так и разработчикам, использовать новые возможности, более оптимизированный код и улучшить совместимость со сторонними библиотеками что также используют компоненты Symfony.
¶Мелочь, а приятно
В Drupal 9 были и небольшие изменения, но даже их стоит упомянуть:
- В Drupal 9.1.0 была включена ленивая загрузка для изображений по умолчанию.
- В Drupal 9.1.0 был добавлен новый компонент Front Matter который позволяет парсить метаданные в формате YAML из различных файлов. Данный документ также парсится данными компонентом. 🎉
- В Drupal 9.1.0 внесено множество улучшений для того чтобы Drupal стал совместимым с PHP 8.0.
- В Drupal 9.2.0 добавили поддержку для файлов, в расширении которых есть нижнее подчёркивание. Например:
example.x_t
. - В Drupal 9.2.0 добавили поддержку конвертации изображений в WebP при помощи стилей изображений.
- В Drupal 9.2.0 добавлено новое событие
FileUploadSanitizeNameEvent
, при помощи которого можно централизованно очищать названия загружаемых файлов. - В Drupal 9.2.0 добавили вывод предупреждений о релизах безопасности для администратора сайта, даже если отключен модуль Update. Это поведение также отключаемо, но крайне не рекомендуется!
- Начиная с Drupal 9.3.0 на страницах нод и терминов таксономии больше не добавляются специфичные для Drupal мета-теги, например:
delete-form
,edit-form
и т.д. Они никому не мешали, но и ни кому не были нужны! А ещё создавали нагрузку. - В Drupal 9.3.0 темы оформления и модули получили новые свойства
lifecycle
иlyfecycle_link
. - В Drupal 9.3.0 добавили поддержку автомонтирования для сервисов.
- В Drupal 9.3.0 права доступа могут объявлять зависимости.
- В Drupal 9.3.0 ресурсы для JSON:API теперь можно программно переименовать.
- В Drupal 9.3.0 разрешения модулей могут быть отредактированы и просмотрены для конкретного модуля или набора модулей, а не всех сразу.
- В Drupal 9.3.0 внесено множество улучшений для того чтобы Drupal стал совместимым с PHP 8.1.
- В Drupal 9.4.0 темам оформления добавили возможность предоставления стартовых тем.
¶Смотрите также
- Drupal 8
- Drupal 10
- Руководство по обновлению Drupal 9 до Drupal 10
- Список изменений Drupal 9.0.0
- Список релизов Drupal
¶Ссылки
- Drupal 9 (англ.), drupal.org