workspace, environment: $environment, ); } public static function forRecord(Model $record, UiActionContextSource $source = UiActionContextSource::Record): self { $environment = self::environmentFromRecord($record); return new self( scope: UiActionScope::Record, source: $source, workspace: $environment?->workspace, environment: $environment, record: $record, ); } public static function forSystem(UiActionContextSource $source = UiActionContextSource::Explicit): self { return new self( scope: UiActionScope::System, source: $source, ); } public static function missing( string $reason = self::CONTEXT_MISSING, UiActionContextSource $source = UiActionContextSource::Missing, ): self { return new self( scope: UiActionScope::Missing, source: $source, missingReason: $reason === '' ? self::CONTEXT_MISSING : $reason, ); } public function isMissing(): bool { return $this->scope === UiActionScope::Missing || $this->missingReason !== null; } public function missingReason(): ?string { return $this->missingReason; } public function workspace(): ?Workspace { return $this->workspace; } public function environment(): ?ManagedEnvironment { return $this->environment; } public function tenant(): ?ManagedEnvironment { return $this->environment(); } public function record(): ?Model { return $this->record; } public function requireWorkspace(): Workspace { if ($this->workspace instanceof Workspace) { return $this->workspace; } throw new RuntimeException($this->missingReason ?? self::WORKSPACE_MISSING); } public function requireEnvironment(): ManagedEnvironment { if ($this->environment instanceof ManagedEnvironment) { return $this->environment; } throw new RuntimeException($this->missingReason ?? self::ENVIRONMENT_MISSING); } private static function environmentFromRecord(Model $record): ?ManagedEnvironment { if ($record instanceof ManagedEnvironment) { return $record; } if (method_exists($record, 'relationLoaded') && $record->relationLoaded('tenant')) { $tenant = $record->getRelation('tenant'); if ($tenant instanceof ManagedEnvironment) { return $tenant; } } if (method_exists($record, 'tenant')) { $tenant = $record->getAttribute('tenant'); if ($tenant instanceof ManagedEnvironment) { return $tenant; } } return null; } }