Я использую модуль Migrate для миграции с D7 на D8 и пишу всю миграцию вручную в коде (вместо того, чтобы использовать встроенный модуль миграции D7, так как я хотел более детального управления миграцией).
У меня есть следующая структура: сайт D7 имеет поле изображения, где изображения хранятся в виде файловых объектов. На сайте D8 поле изображения является ссылкой на объект Media (а объект Media, в свою очередь, имеет поле Image).
Первоначально у меня было следующее для миграции изображений:
id: image_files
source:
plugin: legacy_images
constants:
source_base_path: http://example.com/
destination:
plugin: 'entity:file'
process:
fid: fid
filename: filename
source_full_path:
-
plugin: concat
delimiter: /
source:
- constants/source_base_path
- uri
-
plugin: urlencode
uri:
plugin: file_copy
source:
- '@source_full_path'
- uri
filemime: filemime
status: status
Внутри моего файла миграции узла статьи у меня было следующее:
'field_article_image/target_id':
plugin: migration
migration: image_files
source: field_article_image
но я понял, что это не сработает. Идентификатор target_id, полученный в результате миграции image_files, на самом деле был идентификатором объекта File File ID, а не идентификатором объекта Media. В идеальном мире я хотел бы найти способ создать третью миграцию, которая создала бы этот средний шаг, и перенести файловые сущности в медиа-сущности, а затем сопоставить эту миграцию с миграцией статей. Тем не менее, я не могу найти хороший способ сделать это.
План B будет состоять в том, чтобы просто создать плагин процесса для миграции изображений, который будет вручную создавать файловые объекты, прикреплять их к медиа-объектам и передавать эту миграцию в Статьи (это удаляет средний шаг). Это будет означать, однако, что, хотя сущности Media можно откатить, объекты File не могут.