PackageManagerUpdateProcessor.php

Namespace

Drupal\package_manager

File

core/modules/package_manager/src/PackageManagerUpdateProcessor.php

View source
<?php

declare (strict_types=1);
namespace Drupal\package_manager;

use Drupal\Component\Datetime\TimeInterface;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\KeyValueStore\KeyValueExpirableFactoryInterface;
use Drupal\Core\KeyValueStore\KeyValueFactoryInterface;
use Drupal\Core\PrivateKey;
use Drupal\Core\Queue\QueueFactory;
use Drupal\Core\State\StateInterface;
use Drupal\update\UpdateFetcherInterface;
use Drupal\update\UpdateProcessor;

/**
 * Extends the Update module's update processor allow fetching any project.
 *
 * The Update module's update processor service is intended to only fetch
 * information for projects in the active codebase. Although it would be
 * possible to use the Update module's update processor service to fetch
 * information for projects not in the active code base this would add the
 * project information to Update module's cache which would result in these
 * projects being returned from the Update module's global functions such as
 * update_get_available().
 *
 * @internal
 *   This is an internal part of Package Manager and may be changed or removed
 *   at any time without warning. External code should not interact with this
 *   class.
 */
final class PackageManagerUpdateProcessor extends UpdateProcessor {
    public function __construct(ConfigFactoryInterface $config_factory, QueueFactory $queue_factory, UpdateFetcherInterface $update_fetcher, StateInterface $state_store, PrivateKey $private_key, KeyValueFactoryInterface $key_value_factory, KeyValueExpirableFactoryInterface $key_value_expirable_factory, TimeInterface $time) {
        parent::__construct(...func_get_args());
        $this->fetchQueue = $queue_factory->get('package_manager.update_fetch_tasks');
        $this->tempStore = $key_value_expirable_factory->get('package_manager.update');
        $this->fetchTaskStore = $key_value_factory->get('package_manager.update_fetch_task');
        $this->availableReleasesTempStore = $key_value_expirable_factory->get('package_manager.update_available_releases');
    }
    
    /**
     * Gets the project data by name.
     *
     * @param string $name
     *   The project name.
     *
     * @return mixed[]
     *   The project data if any is available, otherwise NULL.
     */
    public function getProjectData(string $name) : ?array {
        if ($this->availableReleasesTempStore
            ->has($name)) {
            return $this->availableReleasesTempStore
                ->get($name);
        }
        $project_fetch_data = [
            'name' => $name,
            'project_type' => 'unknown',
            'includes' => [],
        ];
        $this->createFetchTask($project_fetch_data);
        if ($this->processFetchTask($project_fetch_data)) {
            // If the fetch task was successful return the project information.
            return $this->availableReleasesTempStore
                ->get($name);
        }
        return NULL;
    }
    
    /**
     * {@inheritdoc}
     */
    public function processFetchTask($project) {
        // The parent method will set 'update.last_check' which will be used to
        // inform the user when the last time update information was checked. In
        // order to leave this value unaffected we will reset this to its previous
        // value.
        $last_check = $this->stateStore
            ->get('update.last_check');
        $success = parent::processFetchTask($project);
        $this->stateStore
            ->set('update.last_check', $last_check);
        return $success;
    }

}

Classes

Title Deprecated Summary
PackageManagerUpdateProcessor Extends the Update module's update processor allow fetching any project.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.