You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: packages/prompts/README.md
+122Lines changed: 122 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -112,6 +112,128 @@ Damit ein Command sowohl in der CLI als auch im Web korrekt als Flow funktionier
112
112
Mehr ist im Command nicht nötig – keine speziellen Flow-Methoden, keine eigene Persistenz.
113
113
Der Rest (CLI/Web-Unterschied, State, Web-Oberfläche) wird komplett vom Package übernommen.
114
114
115
+
## Ausführung im Browser (Filament)
116
+
117
+
Nachdem du einen Flow-Command erstellt hast, kannst du ihn sowohl in der CLI als auch im Browser ausführen:
118
+
119
+
### CLI-Ausführung
120
+
121
+
```bash
122
+
php artisan prompts:project-setup
123
+
```
124
+
125
+
Der Command läuft wie ein normaler Laravel Artisan Command – alle Prompts werden direkt im Terminal angezeigt.
126
+
127
+
### Web-Ausführung
128
+
129
+
1. Öffne die Filament-Seite "Run Command" (wird automatisch im Navigation-Menü angezeigt)
130
+
2. Wähle einen Flow-Command aus der Liste
131
+
3. Klicke auf "Command starten"
132
+
4. Der Flow läuft Schritt für Schritt im Browser ab:
133
+
- Jeder Step zeigt einen Prompt (Text-Input, Select, Multiselect, Confirm, etc.)
134
+
- Nach jedem Step siehst du den Output des Steps
135
+
- Du kannst jederzeit mit "Zurück zur Command-Auswahl" abbrechen
136
+
- Nach erfolgreichem Abschluss wird der Button zu "Start new command" geändert
137
+
138
+
**Wichtig:** Alle Commands, die im Web ausgeführt werden, werden automatisch in der Datenbank geloggt (siehe [Command Execution Logging](#command-execution-logging)).
139
+
140
+
## Wie und warum wird Reflection verwendet?
141
+
142
+
Wenn du nur Commands schreibst, musst du dich nicht um Reflection kümmern.
143
+
Damit du aber verstehst, was im Hintergrund passiert, hier eine kurze Erklärung.
144
+
145
+
-**Problem 1: Argumente & Optionen im Web setzen**
146
+
Laravel speichert Argumente/Optionen intern in einem geschützten Property `$input` deines Commands.
147
+
In der CLI kümmert sich der Artisan-Kernel darum, dieses Property zu setzen.
148
+
Im Web-Flow erzeugen wir aber selbst neue Command-Instanzen – und müssen `$input` daher manuell setzen.
149
+
Genau das macht `PromptFlowRunner::setCommandInput()` mit Reflection:
150
+
- es findet das `input`-Property auf deinem Command-Objekt,
151
+
- macht es kurz zugänglich,
152
+
- und schreibt das aktuelle Input-Objekt hinein.
153
+
**Ergebnis:** In Flow-Commands kannst du überall ganz normal `argument()` und `option()` verwenden – egal ob der Command per CLI oder im Browser läuft.
154
+
155
+
-**Problem 2: Command-State zwischen Web-Requests merken**
156
+
Im Web besteht dein Flow aus mehreren HTTP-Requests. Ohne zusätzliche Logik wären Properties wie `$environment`, `$features`, `$projectName` im nächsten Step einfach weg.
157
+
`PromptFlowRunner` löst das mit zwei internen Methoden:
158
+
-`captureCommandContext($command, $state)`
159
+
- liest per Reflection alle nicht-statischen Properties deiner konkreten Command-Klasse aus
160
+
- speichert einfache Werte (Scalars, Arrays, `null`) im `PromptFlowState::$context`
161
+
-`restoreCommandContext($command, $state)`
162
+
- setzt beim nächsten Request alle gespeicherten Werte wieder zurück auf das neue Command-Objekt
163
+
**Ergebnis:** Für deinen Code fühlt es sich so an, als würde derselbe Command einfach weiterlaufen – du musst keine eigene Persistenz (Cache, Datenbank, Session, …) schreiben.
164
+
165
+
-**Problem 3: Package-Tools im Web initialisieren**
166
+
Viele Packages, die `Spatie\LaravelPackageTools` verwenden, registrieren ihre publishable Ressourcen (Config, Views, Migrations, Assets, …) nur im CLI-Kontext.
167
+
`WebCommandRunner` verwendet Reflection, um intern an das `package`-Objekt eines solchen Service Providers zu kommen und die `publishes(...)`-Registrierung auch im Web nachzuholen.
168
+
**Ergebnis:** Befehle wie `vendor:publish` funktionieren im Browser genauso zuverlässig wie in der CLI, obwohl Laravel dort eigentlich nicht im Console-Modus läuft.
169
+
170
+
**Wichtig:**
171
+
Reflection wird nur in diesen internen Klassen des Packages verwendet, nicht in deinen Commands.
172
+
Deine Commands bleiben normale Laravel-Commands – du musst nur:
173
+
174
+
- von `FlowCommand` erben,
175
+
- Properties für den State definieren,
176
+
- Steps in `promptFlowSteps()` auflisten,
177
+
-`step*`-Methoden schreiben (am besten ein Prompt pro Step).
178
+
179
+
Den Rest (Reflection, State, Web-Flow) übernimmt das Package für dich.
180
+
181
+
### Gibt es Alternativen ohne Reflection?
182
+
183
+
Ja – theoretisch könnten wir auf Reflection verzichten, aber das hätte Nachteile für dich als Nutzer:
184
+
185
+
- Für **Argumente & Optionen** könnten wir eine eigene API einführen (statt `argument()/option()`), oder erzwingen, dass du alles manuell über Properties/Arrays verwaltest. Das wäre weniger “Laravel-typisch” und schwerer zu verstehen.
186
+
- Für den **Command-State zwischen Steps** könnten wir dich z.B. eine Methode wie `flowContextKeys()` implementieren lassen, in der du alle zu speichernden Properties auflistest, oder dich zwingen, selbst Cache/DB/Session zu benutzen. Das wäre mehr Boilerplate und eine zusätzliche Fehlerquelle.
187
+
- Für **Spatie Package Tools im Web** bräuchten wir entweder Änderungen im Spatie-Package selbst oder eine eigene, manuelle Konfiguration aller publishbaren Pfade – beides würde die Einrichtung deutlich komplizierter machen.
188
+
189
+
Aus diesen Gründen kapseln wir die Reflection-Nutzung bewusst im Package und halten die API für deine Commands so einfach wie möglich.
190
+
191
+
## Command Execution Logging
192
+
193
+
Alle Commands, die über das Web-Interface ausgeführt werden, werden automatisch in der Datenbank geloggt. Du kannst die Ausführungen in der Filament-Resource "Command Executions" einsehen.
194
+
195
+
### Status
196
+
197
+
Jede Command-Ausführung hat einen der folgenden Status:
198
+
199
+
-**`running`**: Der Command läuft gerade
200
+
-**`completed`**: Der Command wurde erfolgreich abgeschlossen
201
+
-**`failed`**: Der Command ist mit einem Fehler fehlgeschlagen
202
+
-**`cancelled`**: Der Command wurde vom Benutzer abgebrochen
203
+
204
+
### Gespeicherte Informationen
205
+
206
+
Für jede Ausführung werden folgende Daten gespeichert:
0 commit comments