Update: core-bundle v0.2.37, contao-ai-cli v0.13.3
Geändert
- Die Listenbefehle antworten mit JSON vom Server statt mit einer geparsten ASCII-Tabelle. Werte behalten ihren Typ (3 statt "3", NULL unterscheidbar), Zeilen liegen unter "results", und count gegen total sagt, ob gekürzt wurde. Ab CLI v0.9.0 braucht jede Liste das core-bundle auf dem Ziel — vorher lief das über doctrine:query:sql und damit auf nacktem Contao.
- eval.rgxp wird beim Schreiben durchgesetzt, eval.unique jetzt auch beim Update. date/time/datim sind ausgenommen: deren rgxp beschreibt die Widget-Eingabe im Anzeigeformat, nicht die Speicherform.
- Fehlt einer Tabelle die DCA, weil das zugehörige Bundle nicht installiert ist, wird das Paket beim Namen genannt statt nur "DCA not found".
Neu
- Seitenbaum — ebenenweise statt alles auf einmal, zwei Ebenen als Vorgabe, --root zum Absteigen, --depth für mehr. Ein Feld "truncated" sagt, ob darunter noch etwas liegt.
- ext-Gruppe — Console-Commands erreichen, die die CLI nicht wrappt.
- Vertrag am eigenen Command — siehe unten.
Code:
contao:page:tree Seitenbaum, ebenenweise
contao-ai-cli ext list was die Installation kann und die CLI nicht wrappt
contao-ai-cli ext describe shop:x:y Argumente, Optionen, Hilfe — vom Server gelesen
contao-ai-cli ext run shop:x:y ausführen, mit Warnung und tl_log-Eintrag vorab
Ein ungewrappter Command läuft ohne die Zusagen der gewrappten: keine Feldkonvertierung,
keine DCA-Prüfung, keine Zusicherung über Version, Undo oder Logeintrag. Die Warnung sagt
das, und der Protokolleintrag entsteht vor dem Start — ein nachträglicher hielte nur fest,
was gutgegangen ist.
Eigenes Plugin einbinden
Attribut an die Command-Klasse, fertig:
Code:
#[AsCommand(name: 'shop:order:confirm', description: 'Bestellung bestätigen')]
#[\Webwerkwien\ContaoAiCoreBundle\Attribute\AiContract(
writes: true,
tables: ['tl_shop_order', 'tl_shop_voucher'],
trace: ['tl_log'],
traceWhen: 'before', // oder 'on-success'
irreversible: 'verschickt eine Bestätigungsmail an den Kunden',
repeatable: false,
answerShape: ['status', 'id'],
genericPathUnsuitable: ['tl_shop_order' => 'Übergänge hängen an save_callbacks'],
)]
class ConfirmOrderCommand extends Command { /* … */ }
Vier Dinge, die man dazu wissen muss:
- Kein composer require. PHP löst eine Attributklasse erst bei newInstance() auf; gelesen werden die Rohwerte über getArguments(), instanziiert wird nie. Der voll qualifizierte Name genügt, kein use — und auf einer Installation ohne das lesende Bundle passiert schlicht nichts.
- Der Präfix bleibt eurer. Die Deklaration macht den Command erreichbar, nicht sein Name. Symfony empfiehlt einen eigenen Präfix, veröffentlichte Contao-Erweiterungen halten es genauso. Ohne Deklaration bleibt nur der Contao-Namensraum erreichbar.
- Die Aufbewahrungsfrist nicht angeben. Sie wird aus der Installation gelesen (logPeriod, undoPeriod, versionPeriod). tl_log und tl_version sind im Standard 7 gegen 90 Tage — das sind keine austauschbaren Zusagen.
- Keine Geschäftsregeln. Vorlauffristen, Saisonhinweise und Ähnliches gehören in die Beschreibung des Commands, nicht in eine maschinenlesbare Zusicherung.
Die Ausgabe trennt, was prüfbar ist — die genannten Tabellen gegen die DCA — von dem, was
nur behauptet werden kann: ob etwas außerhalb der Datenbank passiert, das sich nicht
zurücknehmen lässt, und ob der Command wiederholbar ist. Das steht getrennt und wird auch
so bezeichnet. Dazu der Hinweis, dass ein Vertrag einen Console-Command beschreibt und
nicht alle Schreibwege einer Erweiterung: DCA-Callbacks, Frontend-Controller und Cronjobs
kann er nicht abdecken.
Feldliste und Beschreibung der Ausgabe:
https://github.com/webwerkwien/conta...ur-own-command
Rückmeldung willkommen — besonders, ob ein Feld fehlt oder eines Ballast ist.