| Closure> */ protected array $viewData = []; protected string $viewIdentifier; /** * @param view-string | null $view * @param array | Closure $viewData */ public function view(?string $view, array | Closure $viewData = []): static { if ($view === null) { return $this; } $this->view = $view; if (filled($viewData)) { $this->viewData($viewData); } return $this; } /** * @param view-string | Closure | null $view */ public function defaultView(string | Closure | null $view): static { $this->defaultView = $view; return $this; } /** * @return array */ protected function extractPublicMethods(): array { return ComponentManager::resolve()->extractPublicMethods($this); } /** * @param array | Closure $data */ public function viewData(array | Closure $data): static { $this->viewData[] = $data; return $this; } /** * @return view-string */ public function getView(): string { if (isset($this->view)) { return $this->view; } if (filled($defaultView = $this->getDefaultView())) { return $defaultView; } throw new Exception('Class [' . static::class . '] extends [' . ViewComponent::class . '] but does not have a [$view] property defined.'); } /** * @return view-string | null */ public function getDefaultView(): ?string { return $this->evaluate($this->defaultView); } /** * @return array */ public function getViewData(): array { return Arr::mapWithKeys( $this->viewData, fn (mixed $data): array => $this->evaluate($data) ?? [], ); } public function toHtml(): string { return $this->render()->render(); } public function render(): View { return view( $this->getView(), [ 'attributes' => new ComponentAttributeBag, ...$this->extractPublicMethods(), ...(isset($this->viewIdentifier) ? [$this->viewIdentifier => $this] : []), ...$this->getViewData(), ], ); } }