Home >Backend Development >PHP Tutorial >Your First Drupal 8 Migration
Drupal 8 Migration: A Deep Dive into Content Transfer
The Migrate module is a cornerstone of the Drupal ecosystem, so much so that core Drupal 8 integrated some of its functionality. This was crucial for replacing traditional upgrades with content and configuration migrations from Drupal 6 and 7 to Drupal 8. While core now includes the basic framework (in the migrate
module) and Drupal 6/7 upgrade tools (in migrate_drupal
), many essential features remain in contributed modules. Migrate Tools
is particularly important, providing Drush commands and a user interface for managing migrations. Additionally, modules like Migrate Source CSV
, Migrate Source XML
, and Migrate Source JSON
offer plugins for common data sources.
This article demonstrates Drupal 8 migration by importing content into node entities. For simplicity, we'll use database tables within the Drupal installation. The complete code is available in [this repository](link_to_repository_here - replace with actual link if available).
Key Concepts:
Migrate Tools
is vital for running migrations via Drush (the recommended method). Commands like drush migrate-import --all
and drush migrate-rollback --all
control the process.Migration Architecture:
A Drupal 8 migration uses the plugin system. The source plugin provides raw data, process plugins transform it, and destination plugins save it into Drupal entities. This pipeline is defined within a migration configuration entity (usually module config, imported on module enablement).
Example: Movie Migration
Our example involves two database tables: movies
(id, name, description) and movies_genres
(id, movie_id, name). The following MySQL script creates these tables and populates them with sample data:
<code class="language-sql">CREATE TABLE `movies` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `description` text, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; CREATE TABLE `movies_genres` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `movie_id` int(11) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; INSERT INTO `movies` (`id`, `name`, `description`) VALUES (1, 'Big Lebowsky', 'My favorite movie, hands down.'), (2, 'Pulp fiction', 'Or this is my favorite movie?'); INSERT INTO `movies_genres` (`id`, `movie_id`, `name`) VALUES (1, 1, 'Comedy'), (2, 1, 'Noir'), (3, 2, 'Crime');</code>
The goal is to migrate movies into Article nodes and genres into Taxonomy terms (Tags vocabulary), maintaining the movie-genre association.
Genre Migration (migrate.migration.genres.yml
):
<code class="language-yaml">id: genres label: Genres migration_group: demo source: plugin: genres key: default destination: plugin: entity:taxonomy_term process: vid: plugin: default_value default_value: tags name: name</code>
The Genres.php
source plugin (located in Plugin/migrate/source
) defines the SQL query, fields, and IDs.
Movie Migration (migrate.migration.movies.yml
):
<code class="language-sql">CREATE TABLE `movies` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `description` text, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; CREATE TABLE `movies_genres` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `movie_id` int(11) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; INSERT INTO `movies` (`id`, `name`, `description`) VALUES (1, 'Big Lebowsky', 'My favorite movie, hands down.'), (2, 'Pulp fiction', 'Or this is my favorite movie?'); INSERT INTO `movies_genres` (`id`, `movie_id`, `name`) VALUES (1, 1, 'Comedy'), (2, 1, 'Noir'), (3, 2, 'Crime');</code>
The Movies.php
source plugin uses prepareRow()
to add a 'genres' field containing genre IDs.
Activation and Execution:
Migrate Tools
.migrate-status
, migrate-import --all
, migrate-rollback --all
).Conclusion:
This example illustrates Drupal 8's migration capabilities. Explore different source plugins, process plugins, and the potential for custom solutions to handle diverse migration needs.
Frequently Asked Questions (FAQs): (These are largely unchanged from the input, as they are factual and relevant.)
Remember to replace "link_to_repository_here"
with the actual link if you have one.
The above is the detailed content of Your First Drupal 8 Migration. For more information, please follow other related articles on the PHP Chinese website!