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:
- 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
- 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.
Hallo Mathias,
ich stand heute vor dem gleichen Problem, CommandController aber keine Settings in Aussicht
Deinen Tipp mit dem CommandLineLauncher hatte ich versucht, leider erfolglos.
Lösung war bei mir, das Setup mittels ExtensionManagementUtility::addTypoScript zu includen, habe einen kleinen Blogartikel dazu verfasst:
http://www.adick.at/2016/04/25/plugin-settings-in-extbase-commandcontroller/
LG
Alex
Auch eine Lösung, ich vermeide nur gerne das hartkodierte Einbinden von TypoScript, da dann die Reihenfolge nicht mehr gesteuert werden kann.