Jak stworzyć własną komendę Drush 9 w Drupalu 8

Jak Stworzyć Własną Komendę Drush 9 w Drupalu 8

W Drupalu 8.4.X i późniejszych Drush 9 jest jedyną wersją Drusha, która należy do kategorii wspieranych i rekomendowanych. Jedną z zasadniczych zmian jakie wprowadza, jest sposób pisania własnych komend Drush (ang. Drush Commands). Odtąd nie będziemy do ich tworzenia używać plików .inc, stały się one bowiem  klasami opartymi o AnnotatedCommand.

Struktura modułu z własną komendą Drush wyglądać będzie następująco:

Struktura modułu z własną komendą w Drush 9

 

Plik drush9_custom_commands.info.yml

Standardowy plik z podstawowymi informacjami o module.

 

name: Drush 9 Custom Commands
description: Example of Drush 9 custom command.
core: 8.x
type: module
package: Examples

 

Plik drush.services.yml

Użycie standardowego pliku services.yml nie zadziała w tym przypadku i zwróci błąd, gdyż Drush wymaga od nas specjalnego pliku drush.services.yml i to w nim definiujemy service dla naszych komend Drusha.

 

services:
  drush9_custom_commands.commands:
    class: \Drupal\drush9_custom_commands\Commands\Drush9CustomCommands
    tags:
      - { name: drush.command }

 

Plik Drush9CustomCommands.php

Jest to najważniejszy plik, gdyż to w nim znajduje się cała definicja dla komend. 

 

<?php

namespace Drupal\drush9_custom_commands\Commands;

use Drush\Commands\DrushCommands;

/**
 * A drush command file.
 *
 * @package Drupal\drush9_custom_commands\Commands
 */
class Drush9CustomCommands extends DrushCommands {

  /**
   * Drush command that displays the given text.
   *
   * @param string $text
   *   Argument with message to be displayed.
   * @command drush9_custom_commands:message
   * @aliases d9-message d9-msg
   * @option uppercase
   *   Uppercase the message.
   * @option reverse
   *   Reverse the message.
   * @usage drush9_custom_commands:message --uppercase --reverse drupal8
   */
  public function message($text = 'Hello world!', $options = ['uppercase' => FALSE, 'reverse' => FALSE]) {
    if ($options['uppercase']) {
      $text = strtoupper($text);
    }
    if ($options['reverse']) {
      $text = strrev($text);
    }
    $this->output()->writeln($text);
  }
  
}

 

Klasa dla naszych komend dziedziczy z DrushCommands i możemy w niej zawrzeć wiele komend,  z których każda będzie osobną metodą używającą adnotacji.

Niektóre z dostępnych adnotacji:
@command – definicja komendy, która musi być zgodna z strukturą moduł:komenda,
@aliases – aliasy dla komendy, każdy rozdzielony spacją,
@param – wejściowy parametr dla komendy,
@option – opcja dostępna dla komendy, każda z nich powinna być zawarta w tablicy asocjacyjnej, gdzie kluczem jest nazwa opcji,
@usage – przykład użycia komendy.

 

Przykłady użycia dla powyższej komendy:

Drush d9-message 
Hello world!

drush d9-message --uppercase --reverse drupal8
8LAPURD   

 

Podsumowanie

Zapewne osoby, które znają sposób pisania własnych komend Drush sprzed pojawienia się Drusha 9, widzą tutaj sporo różnic. W naszej agencji drupalowej odchodzimy od sposobu dobrze znanego programistom z Drupala 7, na rzecz świeżego rozwiązania opartego o Symfony. Dla osób, które jednak z komendami Drush spotykają się po raz pierwszy zapewne powyższy przykład okaże się mało interesujący. Do czego więc własna komenda Drush może nam posłużyć w praktyce? Przykładowo, niedawno zdarzyło mi integrować Drupala z zewnętrznym serwisem blogowym. Wpisy co określony odstęp czasu, przy pomocy crona zaciągane są do Drupala. Dzięki własnej komendzie Drush mogę w dowolnym momencie, bez użycia UI wywołać taką operację. Ponadto, parametr pozwala na pobranie dowolnej ilości wpisów stosując wartość liczbową lub 'all'. Powyższe rozwiązanie okazało się być bardzo przydatne podczas pierwszej migracji, kiedy pobierane były wszystkie dotychczasowe wpisy. A Twoja własna komenda Drush jaki proces Ci ułatwi?

3. Najlepsze praktyki zespołów programistycznych