Drupal 8へのアップグレード時の移行のカスタマイズ
初期移行を作成する
- 「Drushを使用したアップグレード」セクションで説明されているように、drush migrate-upgrade --configure-onlyを使用して移行を作成します。
- 次のステップが書き込まれるconfig/syncディレクトリがあることを確認してください
- drush config:exportを使用して移行をエクスポートします
- 独自の移行モジュールを作成します
- config/syncディレクトリから新しいカスタムモジュールのconfig/installディレクトリに、使用したいYMLファイルのみをコピーし、必要に応じてuuid値を削除し、id、グループ、ラベル、その他の値を編集します。
- config/syncからmigrate_plus.migration_group.migrate_drupal_7.ymlファイルを新しいカスタムモジュールのconfig/installディレクトリにコピーし、migrate_plus.migration_group.your_module.ymlという名前を付けます。グループファイルにはデータベース設定が含まれているため、必要になります。
移行の管理
- ノードに進む前に、ユーザーロールとユーザーの移行から始めます
- config/installディレクトリにファイルを追加し続けるときは、drush config-import --partial --source=modules/custom/your_module/config/installのようなものでディレクトリを再読み込みします(これにはConfigモジュールを有効にする必要があります)
Drupal 8へのアップグレード時にフィールドの名前を変更する
Drupal 7サイトに、foo、bar、bazフィールドを持つコンテンツタイプAがあるとします。また、Drupal 8でbazフィールドをzotに名前変更したいとします。このような変更は、drushを使用してアップグレードする場合にかなり簡単に行えます。
- 上記のページに示されているように、drush migrate-upgrade --configure-onlyを使用して移行を作成します。
- ノードタイプとフィールドの移行を実行します。これにより、コンテンツタイプAとfoo、bar、bazフィールドが生成されます。
- Drupal 8でzotフィールドを手動で作成します。移行によって作成されたが使用する予定のないbazフィールドを削除します。
- Migrate Plusモジュールを使用すると、プラグインを設定オブジェクトとして実装でき、柔軟に読み込み、変更、保存できます。drush migrate-upgrade --configure-onlyで作成された個々の移行は、admin/config/development/configuration/single/exportに移動し、「設定タイプ」として「Migration」を選択して確認できます。ノード(A)の移行を選択します。
- 移行をadmin/config/development/configuration/single/importにコピーして貼り付けますが、フィールドマッピングを変更して、宛先フィールドをfield_zotにしつつ、field_bazからソースをマッピングし続けます。移行定義の正確な内容はフィールドタイプによって異なります。移行の構造を理解するには、Migrate APIドキュメントの例を参照してください。
- 変更した移行をインポートした後、Drushを使用してノードAの移行を実行し、データがzotフィールドに正しく移行されたことを確認できます。
- ノードリビジョンも移行する予定がある場合は、ノード(A)リビジョンの移行についてもマッピングの変更を繰り返します。
同じ結果を達成する別の方法は、上記のように新しいzotフィールドを手動で作成し、hook_migration_plugins_alter()を実装してノード(A)移行のフィールドマッピングを変更することです。
カスタムプロセスプラグインの作成
独自の変換ロジック(もしこれならこれ)を定義する必要がある場合は、独自のプロセスプラグインの作成を検討できます。
Migrate APIドキュメントの例では、ユーザー移行を例として使用しています。ユーザーの言語コードの定義には例で説明されているif-elseロジックが必要なため、Userモジュールは独自のUserLangcodeプロセスプラグインを提供します。
上記の例では、プロセスをMODULE/src/Plugin/migrate/processディレクトリに保存する方法と、使用できるようにアノテーションを付ける方法について説明しています。独自のプラグインを作成するときは、UserLangcodeや他のプロセスプラグインを例として使用してください!
hook_migrate_prepare_row()
独自の変換ロジックを定義する必要がある場合は、カスタムモジュールでhook_migrate_prepare_row()を実装し、そこでロジックを実装することもできます。
フックのAPIドキュメントで説明されているように、フックには3つの引数があります:
- Row $row
- MigrateSourceInterface $source
- MigrationInterface $migration
フックのAPIドキュメントで説明されているように、$migration->id()を使用して、ロジックを目的の移行のみに制限できます。
ソースプロパティを変数に読み込むには、Row::getSourceProperty()を使用します。たとえば、ソース行にtypeという名前のプロパティがある場合、$type = $row->getSourceProperty('type');とできます。
移行定義でソースとして使用できるまったく新しいプロパティを設定するには、Row::setSourceProperty()を使用します。
ソースサイトへのデータベースクエリを実行するには、接続APIドキュメントに示されているように、$source->getDatabase()->query()を使用します。
移行から行をスキップするには、新しいMigrateSkipRowException例外をスローできます。
hook_migration_plugins_alter()
移行をカスタマイズする別の方法は、カスタムモジュールでhook_migration_plugins_alter()関数を実装することです。
APIドキュメントで説明されているように、このフックには、検出されたすべての移行の連想配列である1つの引数があります。移行を変更したり、実行したくない移行を削除したりできます。
Migrate PlusはPREPARE_ROWイベントを提供します
hook_migrate_prepare_row()を実装する代わりに、メインのprepare_rowハンドラーへのカスタム応答をオブジェクト指向の方法で記述したい場合は、Migrate Plusモジュールを有効にしていればそれが可能です。Migrate Plusは、サブスクライバーが購読できるPREPARE_ROWイベントを提供します。イベントのDrupal 8 APIドキュメントです。別のコンテキストでのイベントサブスクライバーの実装例については、Simple FB Connectモジュールリファレンスのこの例を参照してください。