Das TYPO3-CLI (Command Line Interface)

Einfacher und schneller über die Kommandozeile: Das TYPO3 CLIs steht für TYPO3 Command-Line-Interface und ist sehr hilfreich bei der Bereitstellung und Pflege einer TYPO3 Seite.

Ein TYPO3 CMS ist i.d.R. auf dem Webserver abgelegt, welcher über SSH zu erreichen ist. Hier kann man relativ einfach über die Kommandozeile, wie etwa dem Terminal bei MacOS, Putty unter Windows oder der Linux-Shell (natürlich gibt es noch diverse weitere Kommandozeilen-Tools) Aufgaben ausführen oder automatisieren, ohne sich dafür erst im TYPO3-Backend anmelden zu müssen.

So lässt sich z.B. über das Terminal der TYPO3-Cache leeren, das Datenbank-Schema aktualisieren, Daten-Exporte initiieren, das Backend sperren u.v.m.. Ist ein Cron-Job eingerichtet, lassen sich auch wiederholende Tasks ausführen, wie beispielsweise das tägliche oder wöchentliche aktualisieren des Referenzindexes von TYPO3.

Welche Befehle zur Verfügung stehen kann man ermitteln, indem man in das folgende Binary-Verzeichnis wechselt ...

 

$ cd /typo3/sysext/core/bin/

 

und dann den list-Befehl aufruft, mit dem alle registrierten Befehle aufgelistet werden:

 

$ php typo3 list

 

Welche Befehle zur Verfügung stehen kann man ermitteln, indem man in das folgende Binary-Verzeichnis wechselt ...

 

Die Ausgabe sieht beispielsweise so aus:

 

 
(per Klick vergrößern)

 

Früher brachte TYPO3 vom Kern aus ein ausführbares Dispatcher-Script mit, mit dem man Befehle zum Laufen bringen konnte: /typo3/cli_dispatch.phpsh

Dieses wurde aber mit TYPO3-Version 8 in der Form abgeschafft und Einzug erhielt stattdessen die Symfony-Konsole, die dem Entwickler viel Aufwand ersparte, da Symfony bereits viele Funktionen von Grund auf mitbringt und zur Verwendung zur Verfügung stellt. Die Schnittstelle zwischen TYPO3 und der Symfony Konsole besteht aus gerade mal 4 Dateien und mit keiner dieser Dateien kommt man in Berührung.

 

 

TYPO3 CLI Shell-Scripte registrieren

 

Um eigene Befehle nutzen zu können wird es nötig sein, diese zu registrieren. Dafür gibt es 2 mögliche Wege:

 

1) Die Verwendung des TYPO3 command-line Dispatchers basierend auf Symfony-Befehlen oder

2) Erstellen eines eigenen Extbase Command Controllers. (Achtung: dieser gilt seit TYPO3-Version v9 als veraltet!)

 

Daher schauen wir uns speziell den TYPO3 command-line Dispatcher genauer an:

 

Der TYPO3 command-line Dispatcher

 

TYPO3 verwendet wie bereits erwähnt Symfony-Befehle, um so eine einfach nutzbare und gut dokumentierte API zum Schreiben von CLI-Befehlen bereitzustellen.

Wie kann man sich nun einen eigenen Befehl für seine Extension erstellen: Dafür wechselt man in eben diese und erstellt im Configure-Verzeichns eine Commands.php.

Die Commands.php liefert ein oder mehrere Array-Elemente zurück bei denen der Array-Key den zu verwendenden Shell-Befehl wiederspiegelt, in diesem Falle myextension:example, und der class-Part die PHP Klasse, die für die Ausführung des Befehls zuständig sein soll:

 

/typo3conf/ext/myextension/Configure/Commands.php:

 

<?php

use Vendor\Myextension\Command\MyExampleCommand;

 

return [

    'myextension:example' => [

        'class' => MyExampleCommand::class

    ]

];

 

TYPO3 schaut hierbei nun mithilfe des CommandRequestHandler.php in jeder Extension in den Konfigurations-Ordner nach einer Commands.php die mögliche Befehlskonfigurationen mitliefert:

Wenn diese Datei existiert, werden alle enthaltenen PHP-Klassen als Kommandos registriert. Diese lassen sich nun über das CLI ausführen.

 

Eigene Befehle definieren

 

Nun legt man sich eine Klasse mit einem eigenen Befehl an:

/typo3conf/ext/myextension/Classes/Commands/MyExampleCommand.php

In einer Command-Klasse gibt es 2 wesentliche Methoden. Zum einen die protected Methode configure(), mit der man Einstellungen zum Befehl selbst festlegt. Hier definiert man z.B. den Befehlsnamen, mit welchem man diesen später in der Konsole aufruft. Ebenso kann eine Beschreibung hinterlegt werden, die per „bin/typo3 list“ neben dem Befehl mit angezeigt wird oder ein Hinweistext, sofern man sich per --help Informationen zu dem Befehl ausgeben lassen möchte.

Zum anderen sollte die protected-Methode execute() vorhanden sein, die die Logik, die Sie beim Ausführen des Befehls ausführen möchten, enthält.

 

/typo3conf/ext/myextension/Classes/Command/MyExampleCommand.php

 

<?php namespace Vendor\Myextension\Command;

use Symfony\Component\Console\Command\Command;

use Symfony\Component\Console\Input\InputInterface;

use Symfony\Component\Console\Output\OutputInterface;

 

class MyExampleCommand extends Command

{

    protected function configure()

    {

            $this->setDescription('This is a example description');

            $this->setHelp('With these commands you can use this task');

    }

 

    protected function execute(InputInterface $input, OutputInterface $output)

    {

        $output->writeln([

            '',

            'Example Output',

            '>>>>>>>><<<<<<<',

        ]);

        $output->writeln([

            'It Works!!!',

            '',

        ]);

    }

}

 

Lässt man sich nun noch einmal alle Befehle, wie oben erwähnt auflisten, wird auch der eigene Command mit aufgelistet und die gesetzte Description dazu angezeigt.

Die Infos (gesetzt per setHelp) zum eigenen Command erhält man über:

 

$ php typo3 help myextension:example

 

Beispiele:

A) Alle Extension auflisten, die im System integriert sind:

 

$ php typo3 extension:list

Ausgabe:

 


(Per Klick vergrößern)

A) Eine Extension (hier „vhs“ deaktivieren / aktivieren

 

// Extension „vhs“ deaktivieren (erscheint danach nicht mehr in der obigen Liste)

$ php typo3 extension:deactivate vhs

 

// Extension „vhs“ aktivieren

$ php typo3 extension:activate vhs

 

Ausgabe (bei der Deaktivierung – analog ähnlich auch bei Aktivierung):

 
(Per Klick vergößern)

 

B) Scheduler-Task mit der ID 2 ausführen

$ php typo3 scheduler:run --task=2

 

C) Tabelle in Konsole ausgeben: 

< Will man seine Ergebnisse per Befehl sauber in einer Tabelle ausgeben, so lässt sich dies einfach in unserer Befehlsklasse einrichten. Zunächst müssen wir zusätzlich zu den Symfony-Interface-Klassen noch die folgenden Klassen einbinden:

(…)

use Symfony\Component\Console\Helper\Table;

use Symfony\Component\Console\Helper\TableSeparator;

use Symfony\Component\Console\Helper\TableStyle;

 

Und in der execute-Methode definiert man nun seine Tabelle:

(…)

protected function execute(InputInterface $input, OutputInterface $output)

{

    // table example

    $style = new TableStyle();

    $style->setHorizontalBorderChar('<fg=red>-</>');

    $style->setVerticalBorderChar('<bg=cyan>|</>');

 

    $table = new Table($output);

    // set special style

    $table->setStyle($style);

    // add table header

    $table->setHeaders(array('Nr.', 'User', 'Number of logins', 'Notice'));

    // add some rows

    $table->addRows(array(

        array(1, 'Schmidt', '3',),

        array(2, 'Mueller', '0', 'in vacation'),

        new TableSeparator(),

        array(3, 'Roth', '7')

    ));

 

    // add an other row

    $table->addRow(array(4, 'Schwarz', '2'));

 

    // set fixed width of each column

    $table->setColumnWidths(array(5,10,3, 20));

    $table->render();

}

 

Die Ausgabe sieht hier nun wie folgt aus:

 
(Per Klick vergößern)

 

Quellen

usetypo3.com/typo3-and-cli.html

docs.typo3.org/typo3cms/CoreApiReference/ApiOverview/BackendModules/CliScripts/Index.html

docs.typo3.org/typo3cms/extensions/scheduler/Installation/SchedulerShellScript/Index.html

symfony.com/doc/current/console.html

www.typo3lexikon.de/typo3-tutorials/core/console.html