| null */ public ?array $data = []; public ?Model $tenant = null; abstract public static function getLabel(): string; public static function routes(Panel $panel): void { $slug = static::getSlug(); Route::get("/{$slug}", static::class) ->middleware(static::getRouteMiddleware($panel)) ->withoutMiddleware(static::getWithoutRouteMiddleware($panel)) ->name('registration'); } /** * @return string | array */ public static function getRouteMiddleware(Panel $panel): string | array { return [ ...(static::isEmailVerificationRequired($panel) ? [static::getEmailVerifiedMiddleware($panel)] : []), ...static::$routeMiddleware, ]; } public function mount(): void { abort_unless(static::canView(), 404); $this->form->fill(); } /** * @param array $data * @return array */ protected function mutateFormDataBeforeRegister(array $data): array { return $data; } public function register(): void { try { $this->callHook('beforeValidate'); $data = $this->form->getState(); $this->callHook('afterValidate'); $data = $this->mutateFormDataBeforeRegister($data); $this->callHook('beforeRegister'); $this->tenant = $this->handleRegistration($data); $this->form->model($this->tenant)->saveRelationships(); $this->callHook('afterRegister'); } catch (Halt $exception) { return; } if ($redirectUrl = $this->getRedirectUrl()) { $this->redirect($redirectUrl); } } /** * @param array $data */ protected function handleRegistration(array $data): Model { return $this->getModel()::create($data); } protected function getRedirectUrl(): ?string { return Filament::getUrl($this->tenant); } public function form(Form $form): Form { return $form; } /** * @return array */ protected function getForms(): array { return [ 'form' => $this->form( $this->makeForm() ->model($this->getModel()) ->statePath('data'), ), ]; } public function getModel(): string { return Filament::getTenantModel(); } public function getTitle(): string | Htmlable { return static::getLabel(); } public static function getSlug(): string { return static::$slug ?? 'new'; } public function hasLogo(): bool { return false; } /** * @return array */ protected function getFormActions(): array { return [ $this->getRegisterFormAction(), ]; } public function getRegisterFormAction(): Action { return Action::make('register') ->label(static::getLabel()) ->submit('register'); } protected function hasFullWidthFormActions(): bool { return true; } public static function canView(): bool { try { return authorize('create', Filament::getTenantModel())->allowed(); } catch (AuthorizationException $exception) { return $exception->toResponse()->allowed(); } } }