|

Drush (9) Command fürs eigene Modul
  1. Führe drush generate drush-command-file aus.

  2. Drush fragt nun nachdem Modul Namen, falls das Modul schon eine composer.json hat fragt drush ob es diese überschreiben soll.

Falls eine composer.json vorhanden ist bitten wir drush diese nicht zu überschreiben, sondern tragen nachdem drush die dateien generiert hat folgendes in unsere composer.json nach

"extra": {
 "drush": {
   "services": {
     "drush.services.yml": "^9"
   }
 }
}

Drush hat uns nun 2 Dateien erstellt

Einmal die src/Commands/{ModulName}Commands.php diese sieht so aus ->

Wichtig hierbei ist die Annotation der funktionen:

@command {Name des Commands z.B cache:clear}
@aliases {Komma separierte command aliasse z.B cc,cache-clear,cr}
@usage {Beschreibung wie das command ausgeführt wird}

<?php
namespace Drupal\{Modul name}\Commands;

use Consolidation\OutputFormatters\StructuredData\RowsOfFields;
use Drush\Commands\DrushCommands;

/**
 *
 * In addition to a commandfile like this one, you need a drush.services.yml
 * in root of your module, and a composer.json file that provides the name
 * of the services file to use.
 *
 * See these files for an example of injecting Drupal services:
 *   - http://cgit.drupalcode.org/devel/tree/src/Commands/DevelCommands.php
 *   - http://cgit.drupalcode.org/devel/tree/drush.services.yml
 */
class {ModulName}Commands extends DrushCommands {

  /**
   * Command description here.
   *
   * @command {Modul name}-commandName
   * @param $arg1 Argument description.
   * @param array $options An associative array of options whose values come from cli, aliases, config, etc.
   * @option option-name option description
   * @usage {Modul name}-commandName foo
   *   Usage description
   * @aliases foo
   */
  public function commandName($arg1, $options = ['option-name' => 'default']) {
    $this->logger()->success(dt('Achievement unlocked.'));
  }

  /**
   * An example of the table output format.
   *
   * @command {Modul name}-token
   * @param array $options An associative array of options whose values come from cli, aliases, config, etc.
   * @aliases token
   * @field-labels
   *   group: Group
   *   token: Token
   *   name: Name
   * @default-fields group,token,name
   *
   * @return \Consolidation\OutputFormatters\StructuredData\RowsOfFields
   */
  public function token($options = ['format' => 'table'])
  {
    $all = \Drupal::token()->getInfo();
    foreach ($all['tokens'] as $group => $tokens) {
      foreach ($tokens as $key => $token) {
        $rows[] = [
          'group' => $group,
          'token' => $key,
          'name' => $token['name'],
        ];
      }
    }
    return new RowsOfFields($rows);
  }

}

Nun haben wir noch die drush.services.yml die im Regelfall auch nicht angefasst werden muss.

services:
  {Module name}.commands:
    class: \Drupal\{Module Name}\Commands\{Modul Name}Commands
    tags:
      - { name: drush.command }

Sobald ihr alles implementiert habt müsst ihr noch drush cr ausführen damit euer command von drush erkannt wird.

Anmerkungen:

  1. Falls ihr ein Globales drush command schreiben möchtet müsst ihr den namespace anpassen (\Drush\Commands[dir-name]).
  2. Die command datei muss auf Commands.php enden (z.B MeinTollesCommandCommands.php).
  3. Der Ordner in dem die Datei liegt muss Commands heißen.
  4. Folgende Ordner gehören zum globalen drush space (../drush, /drush und /sites/all/drush).

Quelle: http://docs.drush.org/en/master/commands/#creating-custom-drush-commands