Drupal 9

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. Помимо перечисленных ниже, было множество других не менее интересных и полезных изменений. Вы можете ознакомиться с ними на соответствующих страницах минорных релизов:

Разработка новой экспериментальной темы 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 темам оформления добавили возможность предоставления стартовых тем.

Смотрите также

Ссылки

🌱 Помогите нам сделать документацию лучше!

Вся документация Druki с отрытым исходным кодом. Нашли ошибку или неточность? Создайте pull request.

Редактировать текущий документ Обсудить улучшение

Или узнайте как контрибутить.

🤔 По-прежнему нужна помощь?

Не нашли ответа на свой вопрос? Попросите помощи у сообщества!

Задайте вопрос на GitHub Смотрите другие ресурсы сообщества