Créer une commande Drush custom sur Drupal

Avec la nouvelle version de Drush 12 on peut utiliser les nouvelles annotations PHP 8. Quelques nouveautés de la console Symfony sont également présentes.

Pour créer la commande il faut ajouter une classe PHP dans un sous-dossier de module custom « module_name/src/Drush/Commands/DemoCommands.php » :

<?php

declare(strict_types=1);

namespace Drupal\module_name\Drush\Commands;

use Drush\Attributes as CLI;
use Drush\Commands\DrushCommands;

final class DemoCommands extends DrushCommands {

  #[CLI\Command(name: 'demo:test', aliases: ['demo-test'])]
  #[CLI\Option(name: 'force', description: 'Force to do something.')]
  public function demo(
    $argument = 'default',
    $options = ['force' => FALSE]
  ) {
    // Argument de la commande.
    $this->output()->writeln('Argument = ' . $argument);
    // Option de la commande.
    $force = ($options['force'] === FALSE) ? 'non' : 'oui';
    $this->output()->writeln('Option force = ' . $force);
  }
}

Puis il faut créer un fichier de services Drush : « module_name/drush.services.yml » :

services:
  module_name.commands:
    class: Drupal\module_name\Drush\Commands\DemoCommands
    arguments: []
    tags: 
      - { name: drush.command }

Et voilà! Plus qu’à lancer notre nouvelle commande dans un terminal :

drush demo:test
Argument = default
Option force = non

drush demo:test foo --force
Argument = foo
Option force = oui

Maintenant regardons ce qui est possible de faire avec la sortie de la console.

<?php

use Drush\Exceptions\UserAbortException;

...

// Erreur.
$this->output()->writeln('<error>Texte sur fond rouge.</error>');
// Commentaire.
$this->output()->writeln('<comment>Texte en jaune</comment>');
// Info.
$this->output()->writeln('<info>Texte en vert</info>');
// Question.
$this->output()->writeln('<question>Texte sur fond bleu.</question>');
// Demande de choix à l'utilisateur.
if (!$this->io()->confirm(dt('Est-tu sûr de toi?'))) {
  throw new UserAbortException();
}

Pour injecter des dépendances c’est exactement comme n’importe quel service Drupal, il faut simplement ajouter les noms des dépendances dans « arguments » du fichier YML et un constructeur dans la classe PHP.


Publié

dans

,

par

Étiquettes :