*/ public function getValidationAttributes(): array { $attributes = []; foreach ($this->getComponents(withHidden: true) as $component) { if ($component->isHiddenAndNotDehydrated()) { continue; } if ($component instanceof Components\Contracts\HasValidationRules) { $component->dehydrateValidationAttributes($attributes); } foreach ($component->getChildComponentContainers() as $container) { if ($container->isHidden()) { continue; } $attributes = [ ...$attributes, ...$container->getValidationAttributes(), ]; } } return $attributes; } /** * @return array */ public function getValidationMessages(): array { $messages = []; foreach ($this->getComponents(withHidden: true) as $component) { if ($component->isHiddenAndNotDehydrated()) { continue; } if ($component instanceof Components\Contracts\HasValidationRules) { $component->dehydrateValidationMessages($messages); } foreach ($component->getChildComponentContainers() as $container) { if ($container->isHidden()) { continue; } $messages = [ ...$messages, ...$container->getValidationMessages(), ]; } } return $messages; } /** * @return array> */ public function getValidationRules(): array { $rules = []; foreach ($this->getComponents(withHidden: true) as $component) { if ($component->isHiddenAndNotDehydrated()) { continue; } if ($component instanceof Components\Contracts\HasValidationRules) { $component->dehydrateValidationRules($rules); } foreach ($component->getChildComponentContainers() as $container) { if ($container->isHidden()) { continue; } $rules = [ ...$rules, ...$container->getValidationRules(), ]; } } return $rules; } /** * @return array */ public function validate(): array { if (! count(array_filter( $this->getComponents(withHidden: true), fn (Component $component): bool => ! $component->isHiddenAndNotDehydrated(), ))) { return []; } $rules = $this->getValidationRules(); if (! count($rules)) { return []; } $livewire = $this->getLivewire(); // By storing the currently validating form in the Livewire component, we can optimize the validation process // so that the `prepareForValidation()` method is only called for the current form instead of all forms. // This can also prevent infinite loops involving schemas that self-validate, such as the table query // builder which crashes when it is being used while an action is submitted. $livewire->currentlyValidatingForm($this); try { return $livewire->validate($rules, $this->getValidationMessages(), $this->getValidationAttributes()); } finally { $livewire->currentlyValidatingForm(null); } } }