*/ protected function rules(): array { return ['password' => [...PasswordPolicy::rules(), 'confirmed']]; } public function mount(string $token): void { $this->token = $token; // Aus der Adresszeile vorbelegt, aber als Feld sichtbar: eine Mail, die // unterwegs umgebrochen wurde, lässt sich so noch von Hand retten. $this->email = (string) request()->query('email', ''); } /** * NICHT reset(): Livewire\Component::reset() leert Eigenschaften, und eine * Komponente, die sie neu deklariert, lädt gar nicht erst. */ public function save(): void { $this->validate(); $status = Password::broker('operators')->reset( [ 'email' => $this->email, 'password' => $this->password, 'password_confirmation' => $this->password_confirmation, 'token' => $this->token, ], function (Operator $operator, string $password) { $operator->forceFill([ 'password' => Hash::make($password), // Jede bestehende „Angemeldet bleiben"-Sitzung stirbt mit. // Beim ersten Setzen ist keine da; beim zweiten Weg über // diese Seite — einer erneuten Einladung — sehr wohl. 'remember_token' => Str::random(60), ])->save(); event(new PasswordReset($operator)); }, ); if ($status !== Password::PASSWORD_RESET) { // EINE Meldung für alle Fehlschläge, und ausdrücklich nicht // __($status): NICHT weil passwords.token/passwords.user roh auf // der Seite stünden — Laravel liefert dazu eine eigene // Übersetzung mit (lang/en/passwords.php im Framework, und // fallback_locale ist en), der Schlüssel löst also durchaus auf. // Der eigentliche Grund ist ein anderer: die Fehlschläge zu // unterscheiden wäre falsch — „diese Adresse kennen wir nicht" // verrät einem Fremden, wer Betreiber ist. $this->addError('email', __('auth.console_invite_invalid')); return; } $this->done = true; } public function render() { return view('livewire.auth.operator-set-password'); } }