You are here

BatchProcessor.php in Automatic Updates 8.2

File

src/BatchProcessor.php
View source
<?php

namespace Drupal\automatic_updates;

use Drupal\automatic_updates\Exception\UpdateException;
use Drupal\Core\Url;
use Symfony\Component\HttpFoundation\RedirectResponse;

/**
 * A batch processor for updates.
 */
class BatchProcessor {

  /**
   * Gets the updater service.
   *
   * @return \Drupal\automatic_updates\Updater
   *   The updater service.
   */
  protected static function getUpdater() : Updater {
    return \Drupal::service('automatic_updates.updater');
  }

  /**
   * Records messages from a throwable, then re-throws it.
   *
   * @param \Throwable $error
   *   The caught exception.
   * @param array $context
   *   The current context of the batch job.
   *
   * @throws \Throwable
   *   The caught exception, which will always be re-thrown once its messages
   *   have been recorded.
   */
  protected static function handleException(\Throwable $error, array &$context) : void {
    $error_messages = [
      $error
        ->getMessage(),
    ];
    if ($error instanceof UpdateException) {
      foreach ($error
        ->getValidationResults() as $result) {
        $messages = $result
          ->getMessages();
        if (count($messages) > 1) {
          array_unshift($messages, $result
            ->getSummary());
        }
        $error_messages = array_merge($error_messages, $messages);
      }
    }
    foreach ($error_messages as $error_message) {
      $context['results']['errors'][] = $error_message;
    }
    throw $error;
  }

  /**
   * Calls the updater's begin() method.
   *
   * @param string[] $project_versions
   *   The project versions to be staged in the update, keyed by package name.
   * @param array $context
   *   The current context of the batch job.
   *
   * @see \Drupal\automatic_updates\Updater::begin()
   */
  public static function begin(array $project_versions, array &$context) : void {
    try {
      static::getUpdater()
        ->begin($project_versions);
    } catch (\Throwable $e) {
      static::handleException($e, $context);
    }
  }

  /**
   * Calls the updater's stageVersions() method.
   *
   * @param array $context
   *   The current context of the batch job.
   *
   * @see \Drupal\automatic_updates\Updater::stage()
   */
  public static function stage(array &$context) : void {
    try {
      static::getUpdater()
        ->stage();
    } catch (\Throwable $e) {
      static::handleException($e, $context);
    }
  }

  /**
   * Calls the updater's commit() method.
   *
   * @param array $context
   *   The current context of the batch job.
   *
   * @see \Drupal\automatic_updates\Updater::commit()
   */
  public static function commit(array &$context) : void {
    try {
      static::getUpdater()
        ->commit();
    } catch (\Throwable $e) {
      static::handleException($e, $context);
    }
  }

  /**
   * Calls the updater's clean() method.
   *
   * @param array $context
   *   The current context of the batch job.
   *
   * @see \Drupal\automatic_updates\Updater::clean()
   */
  public static function clean(array &$context) : void {
    try {
      static::getUpdater()
        ->clean();
    } catch (\Throwable $e) {
      static::handleException($e, $context);
    }
  }

  /**
   * Finishes the stage batch job.
   *
   * @param bool $success
   *   Indicate that the batch API tasks were all completed successfully.
   * @param array $results
   *   An array of all the results.
   * @param array $operations
   *   A list of the operations that had not been completed by the batch API.
   */
  public static function finishStage(bool $success, array $results, array $operations) : ?RedirectResponse {
    if ($success) {
      return new RedirectResponse(Url::fromRoute('automatic_updates.confirmation_page', [], [
        'absolute' => TRUE,
      ])
        ->toString());
    }
    static::handleBatchError($results);
    return NULL;
  }

  /**
   * Finishes the commit batch job.
   *
   * @param bool $success
   *   Indicate that the batch API tasks were all completed successfully.
   * @param array $results
   *   An array of all the results.
   * @param array $operations
   *   A list of the operations that had not been completed by the batch API.
   */
  public static function finishCommit(bool $success, array $results, array $operations) : ?RedirectResponse {
    if ($success) {
      \Drupal::messenger()
        ->addMessage('Update complete!');

      // @todo redirect to update.php?
      return new RedirectResponse(Url::fromRoute('update.status', [], [
        'absolute' => TRUE,
      ])
        ->toString());
    }
    static::handleBatchError($results);
    return NULL;
  }

  /**
   * Handles a batch job that finished with errors.
   *
   * @param array $results
   *   The batch results.
   */
  protected static function handleBatchError(array $results) : void {
    if (isset($results['errors'])) {
      foreach ($results['errors'] as $error) {
        \Drupal::messenger()
          ->addError($error);
      }
    }
    else {
      \Drupal::messenger()
        ->addError("Update error");
    }
  }

}

Classes

Namesort descending Description
BatchProcessor A batch processor for updates.