Lancer une migration avec Migrate de façon programmatique sur Drupal 8

Combi car

Migrate, un module intégré au coeur de Drupal 8, est une solution puissante permettant de mettre en place des processus d'import de données depuis n'importe quelle source de données (CSV, XML, Base de données, JSON, etc.) vers un projet Drupal 8. Le but de ce billet n'est pas d'explorer toutes les facettes de Migrate, tant elles sont nombreuses et sont déjà par ailleurs traitées dans de nombreux billets de blogs ou sur la documentation officielle, mais plutôt d'aborder un point particulier : comment lancer une migration de façon programmatique ?

En effet il est recommandé d'utiliser Drush pour lancer les différents processus de migration qui sont disponibles. Mais dans certains cas, comme par exemple sur un hébergement limité ne disposant pas de drush ou encore dans le cadre d'un processus de migration continue, ou plutôt d'un import de données continu d'un système tiers vers Drupal 8, il peut être nécessaire de pouvoir déclencher les processus de migration  depuis le code d'un module, et non depuis une commande drush au niveau du serveur.

Le snippet ci-dessous va nous permettre de lancer un (ou plusieurs si nécessaire) processus de migration (ici avec le nom système my_migrate_id) de façon programmatique. A noter en cas d'erreur lors de l'exécution du processus, que nous prenons bien soin de modifier le statut de la migration afin d'être en mesure de la relancer ultérieurement.

 

    $manager = Drupal::service('plugin.manager.migration');
    $migration_ids = ['MY_MIGRATE_ID'];
    foreach ($migration_ids as $migration_id) {
      $migration = $manager->createInstance($migration_id);
      // update existing entity imported.
      $migration->getIdMap()->prepareUpdate();
      $executable = new MigrateExecutable($migration, new MigrateMessage());

      try {
        // Run the migration.
        $executable->import();
      }
      catch (\Exception $e) {
        $migration->setStatus(MigrationInterface::STATUS_IDLE);
      }
    }

Ainsi par exemple pour mettre en place une intégration continue de contenus tiers avec migrate, il suffit alors de placer ce snippet au sein d'un hook_cron() et nous serons alors en mesure de pouvoir le lancer à intervalles régulier sans plus aucune intervention manuelle.

 

Commentaires

Soumis par Simon (non vérifié) le 19/02/2020 à 11:42 - Permalien

On peut même aller un poil plus loin en ajoutant le module "Migrate plus" et obtenir des batchs : il suffit de remplacer "new MigrateExecutable()" par "new MigrateBatchExecutable()", et le tour est joué (pour un lancement depuis un submit de formulaire, par exemple, on voit le batch se dérouler devant nous avec l'avancement en direct).

Ajouter un commentaire