diff -u b/core/modules/migrate/src/Event/MigrateEvents.php b/core/modules/migrate/src/Event/MigrateEvents.php --- b/core/modules/migrate/src/Event/MigrateEvents.php +++ b/core/modules/migrate/src/Event/MigrateEvents.php @@ -13,6 +13,8 @@ * @see \Drupal\migrate\Event\MigrateMapSaveEvent * @see \Drupal\migrate\Event\MigrateMapDeleteEvent * @see \Drupal\migrate\Event\MigrateImportEvent + * @see \Drupal\migrate\Event\MigratePreRowSaveEvent + * @see \Drupal\migrate\Event\MigratePostRowSaveEvent */ final class MigrateEvents { @@ -85,11 +87,11 @@ * * @Event * - * @see \Drupal\migrate\Event\MigratePreSaveEvent + * @see \Drupal\migrate\Event\MigratePreRowSaveEvent * * @var string */ - const PRE_SAVE = 'migrate.pre_save'; + const PRE_ROW_SAVE = 'migrate.pre_row_save'; /** * Name of the event fired just after a single item has been imported. @@ -101,9 +103,9 @@ * @Event * - * @see \Drupal\migrate\Event\MigratePostSaveEvent + * @see \Drupal\migrate\Event\MigratePostRowSaveEvent * * @var string */ - const POST_SAVE = 'migrate.post_save'; + const POST_ROW_SAVE = 'migrate.post_row_save'; } diff -u b/core/modules/migrate/src/Event/MigratePreRowSaveEvent.php b/core/modules/migrate/src/Event/MigratePreRowSaveEvent.php --- b/core/modules/migrate/src/Event/MigratePreRowSaveEvent.php +++ b/core/modules/migrate/src/Event/MigratePreRowSaveEvent.php @@ -58,7 +58,7 @@ * The row object about to be imported. */ public function getRow() { - return $this->migration; + return $this->row; } } diff -u b/core/modules/migrate/src/MigrateExecutable.php b/core/modules/migrate/src/MigrateExecutable.php --- b/core/modules/migrate/src/MigrateExecutable.php +++ b/core/modules/migrate/src/MigrateExecutable.php @@ -204,9 +204,9 @@ if ($save) { try { - $this->eventDispatcher->dispatch(MigrateEvents::PRE_SAVE, new MigratePreRowSaveEvent($this->migration, $row)); + $this->eventDispatcher->dispatch(MigrateEvents::PRE_ROW_SAVE, new MigratePreRowSaveEvent($this->migration, $row)); $destination_id_values = $destination->import($row, $id_map->lookupDestinationId($this->sourceIdValues)); - $this->eventDispatcher->dispatch(MigrateEvents::POST_SAVE, new MigratePostRowSaveEvent($this->migration, $row, $destination_id_values)); + $this->eventDispatcher->dispatch(MigrateEvents::POST_ROW_SAVE, new MigratePostRowSaveEvent($this->migration, $row, $destination_id_values)); if ($destination_id_values) { // We do not save an idMap entry for config. if ($destination_id_values !== TRUE) { diff -u b/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php b/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php --- b/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php +++ b/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php @@ -252,15 +252,6 @@ } /** - * Gets the injected event dispatcher. - * - * @return \Symfony\Component\EventDispatcher\EventDispatcherInterface - */ - protected function getEventDispatcher() { - return $this->eventDispatcher; - } - - /** * Initialize the plugin. */ protected function init() { @@ -541,7 +532,7 @@ } if ($keys) { // Notify anyone listening of the map row we're about to save. - $this->getEventDispatcher()->dispatch(MigrateEvents::MAP_SAVE, new MigrateMapSaveEvent($this, $keys + $fields)); + $this->eventDispatcher->dispatch(MigrateEvents::MAP_SAVE, new MigrateMapSaveEvent($this, $keys + $fields)); $this->getDatabase()->merge($this->mapTableName()) ->key($keys) ->fields($fields) @@ -659,7 +650,7 @@ if (!$messages_only) { // Notify anyone listening of the map row we're about to delete. - $this->getEventDispatcher()->dispatch(MigrateEvents::MAP_DELETE, new MigrateMapDeleteEvent($this, $source_id_values)); + $this->eventDispatcher->dispatch(MigrateEvents::MAP_DELETE, new MigrateMapDeleteEvent($this, $source_id_values)); $map_query->execute(); } $message_query->execute(); @@ -679,7 +670,7 @@ $count++; } // Notify anyone listening of the map row we're about to delete. - $this->getEventDispatcher()->dispatch(MigrateEvents::MAP_DELETE, new MigrateMapDeleteEvent($this, $source_id)); + $this->eventDispatcher->dispatch(MigrateEvents::MAP_DELETE, new MigrateMapDeleteEvent($this, $source_id)); $map_query->execute(); $count = 1; foreach ($source_id as $key_value) { @@ -716,7 +707,7 @@ $sourceids = array(); foreach ($source_id_values as $source_id) { // Notify anyone listening of the map rows we're about to delete. - $this->getEventDispatcher()->dispatch(MigrateEvents::MAP_DELETE, new MigrateMapDeleteEvent($this, $source_id)); + $this->eventDispatcher->dispatch(MigrateEvents::MAP_DELETE, new MigrateMapDeleteEvent($this, $source_id)); $sourceids[] = $source_id; } $this->getDatabase()->delete($this->mapTableName()) @@ -729,7 +720,7 @@ else { foreach ($source_id_values as $source_id) { // Notify anyone listening of the map rows we're deleting. - $this->getEventDispatcher()->dispatch(MigrateEvents::MAP_DELETE, new MigrateMapDeleteEvent($this, $source_id)); + $this->eventDispatcher->dispatch(MigrateEvents::MAP_DELETE, new MigrateMapDeleteEvent($this, $source_id)); $map_query = $this->getDatabase()->delete($this->mapTableName()); $message_query = $this->getDatabase()->delete($this->messageTableName()); $count = 1; reverted: --- b/core/modules/migrate/tests/src/Unit/MigrateTestCase.php +++ a/core/modules/migrate/tests/src/Unit/MigrateTestCase.php @@ -27,10 +27,6 @@ protected function getMigration() { $this->migrationConfiguration += ['migrationClass' => 'Drupal\migrate\Entity\Migration']; $this->idMap = $this->getMock('Drupal\migrate\Plugin\MigrateIdMapInterface'); - $event_dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface'); - $this->idMap - ->method('getEventDispatcher') - ->willReturn($event_dispatcher); $this->idMap->expects($this->any()) ->method('getQualifiedMapTableName') only in patch2: unchanged: --- /dev/null +++ b/core/modules/migrate/src/Tests/MigrateEventsTest.php @@ -0,0 +1,84 @@ +installConfig(array('migrate', 'migrate_events_test')); + } + + /** + * Tests migration events. + */ + public function testMigrateEvents() { + // Run a simple little migration, which should trigger one of each event + // other than map_delete. + /** @var MigrationInterface $migration */ + $migration = entity_load('migration', 'sample_data'); + $executable = new MigrateExecutable($migration, new MigrateMessage); + $executable->import(); + + $event = \Drupal::state()->get('migrate_events_test.pre_import_event', []); + $this->assertIdentical($event['event_name'], MigrateEvents::PRE_IMPORT); + $this->assertIdentical($event['migration']->id(), $migration->id()); + + $event = \Drupal::state()->get('migrate_events_test.post_import_event', []); + $this->assertIdentical($event['event_name'], MigrateEvents::POST_IMPORT); + $this->assertIdentical($event['migration']->id(), $migration->id()); + + $event = \Drupal::state()->get('migrate_events_test.map_save_event', []); + $this->assertIdentical($event['event_name'], MigrateEvents::MAP_SAVE); + $this->assertIdentical($event['fields']['sourceid1'], 'dummy value'); + $this->assertIdentical($event['fields']['destid1'], 'dummy value'); + $this->assertIdentical($event['fields']['source_row_status'], 0); + + $event = \Drupal::state()->get('migrate_events_test.map_delete_event', []); + $this->assertIdentical($event, []); + + $event = \Drupal::state()->get('migrate_events_test.pre_row_save_event', []); + $this->assertIdentical($event['event_name'], MigrateEvents::PRE_ROW_SAVE); + $this->assertIdentical($event['migration']->id(), $migration->id()); + $this->assertIdentical($event['row']->getSourceProperty('data'), 'dummy value'); + + $event = \Drupal::state()->get('migrate_events_test.post_row_save_event', []); + $this->assertIdentical($event['event_name'], MigrateEvents::POST_ROW_SAVE); + $this->assertIdentical($event['migration']->id(), $migration->id()); + $this->assertIdentical($event['row']->getSourceProperty('data'), 'dummy value'); + $this->assertIdentical($event['destination_id_values']['value'], 'dummy value'); + + // Generate a map delete event. + $migration->getIdMap()->delete(['data' => 'dummy value']); + $event = \Drupal::state()->get('migrate_events_test.map_delete_event', []); + $this->assertIdentical($event['event_name'], MigrateEvents::MAP_DELETE); + $this->assertIdentical($event['source_id'], ['data' => 'dummy value']); + } + +} only in patch2: unchanged: --- /dev/null +++ b/core/modules/migrate/tests/modules/migrate_events_test/config/install/migrate.migration.sample_data.yml @@ -0,0 +1,12 @@ +id: sample_data +label: Event test - sample data +migration_tags: + - Event test +source: + plugin: data +process: + value: data +destination: + plugin: dummy +load: + plugin: null only in patch2: unchanged: --- /dev/null +++ b/core/modules/migrate/tests/modules/migrate_events_test/migrate_events_test.info.yml @@ -0,0 +1,5 @@ +name: 'Migrate events test' +type: module +package: Testing +version: VERSION +core: 8.x only in patch2: unchanged: --- /dev/null +++ b/core/modules/migrate/tests/modules/migrate_events_test/migrate_events_test.services.yml @@ -0,0 +1,6 @@ +services: + migrate_events_test.event_subscriber: + class: Drupal\migrate_events_test\EventSubscriber + arguments: ['@state'] + tags: + - { name: event_subscriber } only in patch2: unchanged: --- /dev/null +++ b/core/modules/migrate/tests/modules/migrate_events_test/src/EventSubscriber.php @@ -0,0 +1,145 @@ +state = $state; + } + + /** + * Reacts to map save event. + * + * @param \Drupal\Migrate\Event\MigrateMapSaveEvent $event + * The migration event. + * @param string $name + * The event name. + */ + public function mapSaveEventRecorder(MigrateMapSaveEvent $event, $name) { + $this->state->set('migrate_events_test.map_save_event', array( + 'event_name' => $name, + 'map' => $event->getMap(), + 'fields' => $event->getFields(), + )); + } + + /** + * Reacts to map delete event. + * + * @param \Drupal\Migrate\Event\MigrateMapDeleteEvent $event + * The migration event. + * @param string $name + * The event name. + */ + public function mapDeleteEventRecorder(MigrateMapDeleteEvent $event, $name) { + $this->state->set('migrate_events_test.map_delete_event', array( + 'event_name' => $name, + 'map' => $event->getMap(), + 'source_id' => $event->getSourceId(), + )); + } + + /** + * Reacts to pre-import event. + * + * @param \Drupal\Migrate\Event\MigrateImportEvent $event + * The migration event. + * @param string $name + * The event name. + */ + public function preImportEventRecorder(MigrateImportEvent $event, $name) { + $this->state->set('migrate_events_test.pre_import_event', array( + 'event_name' => $name, + 'migration' => $event->getMigration(), + )); + } + + /** + * Reacts to post-import event. + * + * @param \Drupal\Migrate\Event\MigrateImportEvent $event + * The migration event. + * @param string $name + * The event name. + */ + public function postImportEventRecorder(MigrateImportEvent $event, $name) { + $this->state->set('migrate_events_test.post_import_event', array( + 'event_name' => $name, + 'migration' => $event->getMigration(), + )); + } + + /** + * Reacts to pre-row-save event. + * + * @param \Drupal\Migrate\Event\MigratePreRowSaveEvent $event + * The migration event. + * @param string $name + * The event name. + */ + public function preRowSaveEventRecorder(MigratePreRowSaveEvent $event, $name) { + $this->state->set('migrate_events_test.pre_row_save_event', array( + 'event_name' => $name, + 'migration' => $event->getMigration(), + 'row' => $event->getRow(), + )); + } + + /** + * Reacts to post-row-save event. + * + * @param \Drupal\Migrate\Event\MigratePostRowSaveEvent $event + * The migration event. + * @param string $name + * The event name. + */ + public function postRowSaveEventRecorder(MigratePostRowSaveEvent $event, $name) { + $this->state->set('migrate_events_test.post_row_save_event', array( + 'event_name' => $name, + 'migration' => $event->getMigration(), + 'row' => $event->getRow(), + 'destination_id_values' => $event->getDestinationIdValues(), + )); + } + + /** + * {@inheritdoc} + */ + static function getSubscribedEvents() { + $events[MigrateEvents::MAP_SAVE][] = array('mapSaveEventRecorder'); + $events[MigrateEvents::MAP_DELETE][] = array('mapDeleteEventRecorder'); + $events[MigrateEvents::PRE_IMPORT][] = array('preImportEventRecorder'); + $events[MigrateEvents::POST_IMPORT][] = array('postImportEventRecorder'); + $events[MigrateEvents::PRE_ROW_SAVE][] = array('preRowSaveEventRecorder'); + $events[MigrateEvents::POST_ROW_SAVE][] = array('postRowSaveEventRecorder'); + return $events; + } +} only in patch2: unchanged: --- /dev/null +++ b/core/modules/migrate/tests/modules/migrate_events_test/src/Plugin/migrate/destination/DummyDestination.php @@ -0,0 +1,44 @@ + 'Dummy value']; + } + + /** + * {@inheritdoc} + */ + public function import(Row $row, array $old_destination_id_values = array()) { + return ['value' => $row->getDestinationProperty('value')]; + } + +} only in patch2: unchanged: --- /dev/null +++ b/core/modules/migrate/tests/modules/migrate_events_test/src/Plugin/migrate/source/DataSource.php @@ -0,0 +1,56 @@ + t('Data'), + ); + } + + /** + * {@inheritdoc} + */ + public function initializeIterator() { + return new \ArrayIterator(array(array('data' => 'dummy value'))); + } + + public function __toString() { + return ''; + } + + /** + * {@inheritdoc} + */ + public function getIds() { + $ids['data']['type'] = 'string'; + return $ids; + } + + /** + * {@inheritdoc} + */ + public function count() { + return 1; + } + +}