You are here

class Soap in Migrate Plus 8.2

Same name and namespace in other branches
  1. 8.5 src/Plugin/migrate_plus/data_parser/Soap.php \Drupal\migrate_plus\Plugin\migrate_plus\data_parser\Soap
  2. 8.3 src/Plugin/migrate_plus/data_parser/Soap.php \Drupal\migrate_plus\Plugin\migrate_plus\data_parser\Soap
  3. 8.4 src/Plugin/migrate_plus/data_parser/Soap.php \Drupal\migrate_plus\Plugin\migrate_plus\data_parser\Soap

Obtain SOAP data for migration.

Plugin annotation


@DataParser(
  id = "soap",
  title = @Translation("SOAP")
)

Hierarchy

Expanded class hierarchy of Soap

File

src/Plugin/migrate_plus/data_parser/Soap.php, line 17

Namespace

Drupal\migrate_plus\Plugin\migrate_plus\data_parser
View source
class Soap extends DataParserPluginBase implements ContainerFactoryPluginInterface {

  /**
   * Iterator over the SOAP data.
   *
   * @var \Iterator
   */
  protected $iterator;

  /**
   * Method to call on the SOAP service.
   *
   * @var string
   */
  protected $function;

  /**
   * Parameters to pass to the SOAP service function.
   *
   * @var array
   */
  protected $parameters;

  /**
   * Form of the function response - 'xml', 'object', or 'array'.
   *
   * @var string
   */
  protected $responseType;

  /**
   * {@inheritdoc}
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this->function = $configuration['function'];
    $this->parameters = $configuration['parameters'];
    $this->responseType = $configuration['response_type'];
  }

  /**
   * {@inheritdoc}
   *
   * @throws \SoapFault
   *   If there's an error in a SOAP call.
   * @throws \Drupal\migrate\MigrateException
   *   If we can't resolve the SOAP function or its response property.
   */
  protected function openSourceUrl($url) {

    // Will throw SoapFault if there's
    $client = new \SoapClient($url);

    // Determine the response property name.
    $function_found = FALSE;
    foreach ($client
      ->__getFunctions() as $function_signature) {

      // E.g., "GetWeatherResponse GetWeather(GetWeather $parameters)".
      $response_type = strtok($function_signature, ' ');
      $function_name = strtok('(');
      if (strcasecmp($function_name, $this->function) === 0) {
        $function_found = TRUE;
        foreach ($client
          ->__getTypes() as $type_info) {

          // E.g., "struct GetWeatherResponse {\n string GetWeatherResult;\n}".
          if (preg_match('|struct (.*?) {\\s*[a-z]+ (.*?);|is', $type_info, $matches)) {
            if ($matches[1] == $response_type) {
              $response_property = $matches[2];
            }
          }
        }
        break;
      }
    }
    if (!$function_found) {
      throw new MigrateException("SOAP function {$this->function} not found.");
    }
    elseif (!isset($response_property)) {
      throw new MigrateException("Response property not found for SOAP function {$this->function}.");
    }
    $response = $client
      ->{$this->function}($this->parameters);
    $response_value = $response->{$response_property};
    switch ($this->responseType) {
      case 'xml':
        $xml = simplexml_load_string($response_value);
        $this->iterator = new \ArrayIterator($xml
          ->xpath($this->itemSelector));
        break;
      case 'object':
        $this->iterator = new \ArrayIterator($response_value->{$this->itemSelector});
        break;
      case 'array':
        $this->iterator = new \ArrayIterator($response_value[$this->itemSelector]);
        break;
    }
    return TRUE;
  }

  /**
   * {@inheritdoc}
   */
  protected function fetchNextRow() {
    $current = $this->iterator
      ->current();
    if ($current) {
      foreach ($this
        ->fieldSelectors() as $field_name => $selector) {
        $this->currentItem[$field_name] = $current->{$selector};
      }
      $this->iterator
        ->next();
    }
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DataParserPluginBase::$activeUrl protected property Index of the currently-open url.
DataParserPluginBase::$currentId protected property Value of the ID for the current item when iterating.
DataParserPluginBase::$currentItem protected property Current item when iterating.
DataParserPluginBase::$dataFetcher protected property The data retrieval client.
DataParserPluginBase::$itemSelector protected property String indicating how to select an item's data from the source.
DataParserPluginBase::$urls protected property List of source urls.
DataParserPluginBase::count public function
DataParserPluginBase::create public static function
DataParserPluginBase::current public function
DataParserPluginBase::fieldSelectors protected function Return the selectors used to populate each configured field.
DataParserPluginBase::getDataFetcherPlugin public function Returns the initialized data fetcher plugin.
DataParserPluginBase::key public function
DataParserPluginBase::next public function Implementation of Iterator::next().
DataParserPluginBase::nextSource protected function Advances the data parser to the next source url.
DataParserPluginBase::rewind public function 1
DataParserPluginBase::valid public function
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
PluginBase::$pluginDefinition protected property The plugin implementation definition. 1
PluginBase::$pluginId protected property The plugin_id.
PluginBase::DERIVATIVE_SEPARATOR constant A string which is used to separate base plugin IDs from the derivative ID.
PluginBase::getBaseId public function Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface::getBaseId
PluginBase::getDerivativeId public function Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface::getDerivativeId
PluginBase::getPluginDefinition public function Gets the definition of the plugin implementation. Overrides PluginInspectionInterface::getPluginDefinition 3
PluginBase::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
PluginBase::isConfigurable public function Determines if the plugin is configurable.
Soap::$function protected property Method to call on the SOAP service.
Soap::$iterator protected property Iterator over the SOAP data.
Soap::$parameters protected property Parameters to pass to the SOAP service function.
Soap::$responseType protected property Form of the function response - 'xml', 'object', or 'array'.
Soap::fetchNextRow protected function Retrieves the next row of data from the open source URL, populating currentItem. Overrides DataParserPluginBase::fetchNextRow
Soap::openSourceUrl protected function Overrides DataParserPluginBase::openSourceUrl
Soap::__construct public function Constructs a \Drupal\Component\Plugin\PluginBase object. Overrides DataParserPluginBase::__construct
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.