Preprocess Media Устарел В Drupal 11.3

В Drupal 11.3 произошла важная, но не сразу заметная смена подхода к theming‑слою: классические процедурные preprocess‑функции вида template_preprocess_* были помечены как устаревшие. Это касается и template_preprocess_media(), который многие годы использовался для подготовки переменных в шаблоне media.html.twig.

Формально код продолжает работать, но начиная с 11.3 он считается deprecated и будет полностью удалён в Drupal 12. Это означает, что при разработке новых проектов и при рефакторинге старых стоит переходить на современный механизм — атрибутные хуки.

Почему template_preprocess_media() устарел

Исторически Drupal автоматически находил preprocess‑функции по имени (template_preprocess_node, template_preprocess_media и т. д.). Такой механизм был простым, но плохо масштабировался, не поддерживал DI и выбивался из общей объектно‑ориентированной архитектуры, к которой Drupal последовательно шёл последние годы.

В Drupal 11.3 core перешёл на явную регистрацию хуков через PHP‑атрибуты. Старые template_preprocess_* оставлены лишь как временные прокси и помечены как устаревшие.

Проще говоря: полагаться на них дальше нельзя.

Современная замена: атрибутный preprocess_media

Новый подход предполагает размещение логики в классе внутри модуля, в пространстве имён Drupal\<module>\Hook, и использование атрибута #[Hook].

Минимальные требования:

  • код должен быть в модуле, не в теме;
  • класс должен лежать в src/Hook;
  • имя хука указывается строго как preprocess_media.

Пример реализации

Ниже — рабочий пример атрибутного preprocess‑хука для media, который добавляет в шаблон переменную styled_url для image‑media в определённом view mode.

В данном хуке я вычисляю для media типа image дополнительный URL со стилем картинки uncropped_960w_webp. Значение сохраняется в переменной шаблона styled_url.

На что обратить внимание

Во‑первых, в контексте примера, Media — это не файл. Методов вроде getFileUri() у media‑entity не существует, путь к файлу всегда получается через source‑field (field_media_image в примере выше).

Во‑вторых, атрибутные хуки подхватываются только после полной пересборки контейнера. После добавления класса обязательно выполнить drush cr.

В‑третьих, на текущий момент (Drupal 11.3) theme registry по‑прежнему остаётся процедурным. Атрибуты — это новый слой, который постепенно вытесняет старый, но ещё не везде работает без оговорок. Тем не менее для preprocess‑хуков они уже применимы и поддерживаются core.


Если в коде всё ещё используется template_preprocess_media(), это явный сигнал к рефакторингу. В Drupal 11.3 корректный путь — атрибутный #[Hook('preprocess_media')] в классе модуля. Такой код лучше вписывается в архитектуру Drupal, легче расширяется и безболезненно переживёт переход на Drupal 12.

Мало букафф? Читайте есчо !

Unit-тесты в Drupal 11: настройка PHPUnit и примеры запуска

Июнь 30, 2025 г.

Если вы только начинаете писать тесты в Drupal, то официальная документация — первое место, куда стоит заглянуть. Однако она не всегда отвечает на все вопросы новичков. В этой статье разберём несколько моментов, которые часто вызывают недоумение. ...

Читать

Генерируем UUID прямо в шаблоне

Ноябрь 6, 2025 г.

Понадобилось мне сгенерировать уникальный код, чтобы привязать уникальные стили к конкретному контейнеру. Функция random в twig чаще всего достаточна для этой цели. Но хотелось пойти немного дальше, и вытащить сервис генерации UUID. Это нам приводит ...

Читать
 

Комментарии к «Preprocess Media Устарел В Drupal 11.3»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: