TypoScript-Konfiguration in Extbase Command Controller

Für die Umsetzung einer komfortablen Import-Funktion griff ich bei einem aktuellen Projekt auf das Command-Framework von Extbase zurück. Damit zu arbeiten ist eine wahre Freude; so wird z.B. der DocComment-Block von Kommando-Methoden automatisch ausgewertet und als Hilfetext im CLI-Dispatcher angezeigt. Selbst die Methoden-Argumente werden automatisch von $propertyName CLI-typisch als --property-name zur Verfügung gestellt. Ganz nebenbei wird hiermit auch gleich noch ein Scheduler-Task ohne jegliche weitere Konfiguration angelegt. Achja, die Einrichtung beschränkt sich übrigens auf eine einzige Zeile in der ext_localconf.php. In TYPO3 Flow genügt sogar allein die Existenz des Command-Controllers.

Neben allen Lobeshymnen stieß ich jedoch auf ein großes Problem: Im CLI-Kontext wurde meine TypoScript-Konfiguration nicht geladen.

Diese enthielt u.A. Anpassungen an der Extbase-Persistence, was ich mittels via objects für meine Frontend-Plugins auch ohne weiteres bewerkstelligen konnte. Da diese im CLI-Kontext jedoch fehlten, war nicht mehr als eine Exception zu sehen.

Nach einiger Analyse fand ich die Ursache: da im Extbase Bootstrap frühzeitig die in objects eingetragenen Implementierungen für Interfaces/Klassen im ObjectManager registriert werden, muss dort schon die Konfiguration der jeweiligen Erweiterung geladen werden. Problem hierbei: zu diesem Zeitpunkt wurde der CLI-RequestBuilder noch nicht ausgeführt, welcher als einziger im CLI-Kontext den Erweiterungs-Namen ermitteln und im ConfigurationManager hinterlegen kann. Im Standard-Ablauf also eindeutig zu spät, da hiernach natürlich das gesamte Framework schon gestartet wurde und keine Implementierungen mehr geändert werden können.

Die Lösung dieses Problems gestaltete sich am Ende allerdings recht einfach und kompakt:

  1. Es muss im TypoScript module.tx_myextension definiert werden; im einfachsten Fall genügt es, plugin.tx_myextension dafür zu kopieren:
    module.tx_myextension < plugin.tx_myextension
  2. Es muss ein eigenes CLI-Script angelegt und registriert werden. Zum Anlegen genügt es, das CommandLineLauncher-Script aus Extbase zu kopieren, was nichts weiter tut, als Extbase Bootstrap zu instantiieren und auszuführen. Der wichtigste Punkt hierbei ist, dass beim Aufruf von Bootstrap::run() in der Konfiguration (zweites Argument) der Extension-Name angegeben wird: 

    echo $bootstrap->run('', array(
      'extensionName' => 'MyExtension',
    ));

    Dadurch kann die erwähnte Konfiguration frühzeitig geladen und berücksichtigt werden.Die Registrierung dieses Scripts landet in der ext_localconf.php:

    $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['cliKeys']['my_extension'] = array(
      'EXT:my_extension/Scripts/CommandLineLauncher.php',
      '_CLI_lowlevel'
    );

Hiernach können die jeweiligen Kommandos wie gehabt ausgeführt werden, nur dass nun statt „extbase“ eben der Name der Erweiterung wie unter cliKeys registriert genutzt wird:

./typo3/cli_dispatch.phpsh my_extension <controller>:<command>

Damit steht nun die gesamte Konfiguration auch im CLI-Kontext zur Verfügung. Mission abgeschlossen.

2 thoughts on “TypoScript-Konfiguration in Extbase Command Controller

    1. Mathias Post author

      Auch eine Lösung, ich vermeide nur gerne das hartkodierte Einbinden von TypoScript, da dann die Reihenfolge nicht mehr gesteuert werden kann.

Comments are closed.