You are here

public function LazySubscriber::onInitImport in Feeds 8.3

Adds import plugins as event listeners.

File

src/EventSubscriber/LazySubscriber.php, line 61

Class

LazySubscriber
Event listener that registers Feeds plugins as event listeners.

Namespace

Drupal\feeds\EventSubscriber

Code

public function onInitImport(InitEvent $event, $event_name, EventDispatcherInterface $dispatcher) {
  $stage = $event
    ->getStage();
  if (isset($this->importInited[$stage])) {
    return;
  }
  $this->importInited[$stage] = TRUE;
  switch ($stage) {
    case 'fetch':
      $dispatcher
        ->addListener(FeedsEvents::FETCH, function (FetchEvent $event) {
        $feed = $event
          ->getFeed();
        $result = $feed
          ->getType()
          ->getFetcher()
          ->fetch($feed, $feed
          ->getState(StateInterface::FETCH));
        $event
          ->setFetcherResult($result);
      });
      break;
    case 'parse':
      $dispatcher
        ->addListener(FeedsEvents::PARSE, function (ParseEvent $event) {
        $feed = $event
          ->getFeed();
        $result = $feed
          ->getType()
          ->getParser()
          ->parse($feed, $event
          ->getFetcherResult(), $feed
          ->getState(StateInterface::PARSE));

        // Add data from source plugins to the parser result.
        $source_plugins = $this
          ->getMappedSourcePlugins($feed
          ->getType());
        if (!empty($source_plugins)) {

          /** @var \Drupal\feeds\Feeds\Item\ItemInterface $item */
          foreach ($result as $item) {

            /** @var \Drupal\feeds\Plugin\Type\Source\SourceInterface $source_plugin */
            foreach ($source_plugins as $source => $source_plugin) {
              $item
                ->set($source, $source_plugin
                ->getSourceElement($feed, $item));
            }
          }
        }

        // Finally set the parser result on the event.
        $event
          ->setParserResult($result);
      });
      break;
    case 'process':
      $dispatcher
        ->addListener(FeedsEvents::PROCESS, function (ProcessEvent $event) {
        $feed = $event
          ->getFeed();
        $feed
          ->getType()
          ->getProcessor()
          ->process($feed, $event
          ->getItem(), $feed
          ->getState(StateInterface::PROCESS));
      });
      break;
    case 'clean':
      foreach ($event
        ->getFeed()
        ->getType()
        ->getPlugins() as $plugin) {
        if (!$plugin instanceof CleanableInterface) {
          continue;
        }
        $dispatcher
          ->addListener(FeedsEvents::CLEAN, function (CleanEvent $event) use ($plugin) {
          try {
            $feed = $event
              ->getFeed();
            $plugin
              ->clean($feed, $event
              ->getEntity(), $feed
              ->getState(StateInterface::CLEAN));
          } catch (Exception $e) {
            watchdog_exception('feeds', $e);
          }
        });
      }
      break;
  }
}