…])` — bleibt * unverändert, das betrifft nur, wie diese Klasse den Wert intern hält). */ #[Layout('layouts.bare')] class HostTerminal extends Component { public Host $record; public string $ticket = ''; /** * Warum hier kein Terminal entstehen kann — ein Merkwort aus * `TerminalTicket::blocker()`, oder leer, wenn nichts im Weg steht. */ public string $problem = ''; public function mount(string $host): void { $this->authorize('hosts.manage'); $this->record = Host::query()->where('uuid', $host)->firstOrFail(); /** @var Operator $operator */ $operator = auth('operator')->user(); // Diese Seite wirft nicht. Ein Terminalfenster, das mit Laravels // Fehlerseite aufgeht — Klassenname, Dateipfad, Zeilennummer, // Quelltextauszug —, ist ein Bruch mitten im Produkt: der Betreiber hat // einen Knopf gedrückt und bekommt einen Stacktrace. Was schiefgehen // kann, steht in `blocker()` und wird unten in der Sprache dieses // Fensters hingeschrieben. $this->problem = TerminalTicket::blocker($this->record) ?? ''; if ($this->problem !== '') { return; } // Der Fangzaun dahinter: `blocker()` kennt die Gründe, mit denen wir // rechnen. Reißt `issue()` aus einem, mit dem niemand gerechnet hat // (Redis weg, Tresor kaputt), ist die Antwort dieselbe — eine gestaltete // Seite statt einer Fehlerseite —, nur ohne Versprechen, woran es lag. try { $this->ticket = TerminalTicket::issue($this->record, $operator); } catch (\Throwable $e) { report($e); $this->problem = 'unknown'; } } public function render() { // 'host' ist der Name, den die Ansicht erwartet — die Eigenschaft // heißt aus dem oben erklärten Grund anders. return view('livewire.admin.host-terminal', ['host' => $this->record]) ->title($this->record->name.' — Terminal'); } }