Afficher une barre de progression (progress bar) dans une commande drush

Vous avez une commande drush dont l'execution peut-être assez longue qui itère sur des éléments (ici des medias).

Voici comment afficher une barre de progression (progress bar) dans une commande drush.

Image
progress bar drush

 

Mon fichier de commande drush 

./web/modules/mon_module/src/Drush/Commands/MonModuleCommands.php

<?php

namespace Drupal\mon_module\Drush\Commands;

use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\media\Entity\Media;
use Drush\Attributes as CLI;
use Drush\Commands\AutowireTrait;
use Drush\Commands\DrushCommands;
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\DependencyInjection\Attribute\Autowire;


/**
 * A Drush commandfile.
 */
final class MonModuleCommands extends DrushCommands {

  use AutowireTrait;

  /**
   * Constructs a MonModuleCommands object.
   */
  public function __construct(
    #[Autowire(service: 'entity_type.manager')] private readonly EntityTypeManagerInterface $entityTypeManager,
  ) {
    parent::__construct();
  }

  /**
   * Allow to move existing media from one env to a new one.
   */
  #[CLI\Command(name: 'mon_module:ma_commande', aliases: ['kme'])]
  #[CLI\Option(name: 'limit', description: 'Max numbers of media to migrate.')]
  #[CLI\Usage(name: 'mon_module:move-env --limit 5', description: 'Move at most 5 medias.')]
  public function moveMediaToNewEnv(InputInterface $input, OutputInterface $output, $options = ['limit' => 0]) {
    $limit = (int) $options['limit'];

    $mediaStorage = $this->entityTypeManager->getStorage('media');
    $mediaQuery = $mediaStorage->getQuery();
    $mediaQuery->sort('created', 'ASC');
    
    if ($limit > 0) {
      $mediaQuery->range(0, $limit);
    }
    
    $mediasIds = $mediaQuery->execute();
    
    $nbMedias = count($mediasIds);
    $progressBar = new ProgressBar($output, $nbMedias);
    foreach($mediasIds as $mediaId) {
      // ici faire votre traitement
      $progressBar->advance();
    }
    $progressBar->finish();
  }
  
}

Contenus en rapport

Ajouter un commentaire

Ne sera pas publié
CAPTCHA
Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...