| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- <?php
- /*
- * Copyright (c) Alexandre Gomes Gaigalas <alganet@gmail.com>
- * SPDX-License-Identifier: MIT
- */
- declare(strict_types=1);
- namespace Respect\Validation\Rules;
- use Respect\Validation\Exceptions\NestedValidationException;
- use Respect\Validation\Exceptions\ValidationException;
- use Respect\Validation\Validatable;
- use function array_filter;
- use function array_map;
- /**
- * Abstract class for rules that are composed by other rules.
- *
- * @author Alexandre Gomes Gaigalas <alganet@gmail.com>
- * @author Henrique Moody <henriquemoody@gmail.com>
- * @author Wojciech Frącz <fraczwojciech@gmail.com>
- */
- abstract class AbstractComposite extends AbstractRule
- {
- /**
- * @var Validatable[]
- */
- private $rules = [];
- /**
- * Initializes the rule adding other rules to the stack.
- */
- public function __construct(Validatable ...$rules)
- {
- $this->rules = $rules;
- }
- /**
- * {@inheritDoc}
- */
- public function setName(string $name): Validatable
- {
- $parentName = $this->getName();
- foreach ($this->rules as $rule) {
- $ruleName = $rule->getName();
- if ($ruleName && $parentName !== $ruleName) {
- continue;
- }
- $rule->setName($name);
- }
- return parent::setName($name);
- }
- public function setDefault(string $default, bool $defaultType=false): Validatable
- {
- $parentDefault = $this->getDefault();
- foreach ($this->rules as $rule) {
- $ruleDefault = $rule->getDefault();
- if ($ruleDefault && $parentDefault !== $ruleDefault) {
- continue;
- }
- $rule->setDefault($default, $defaultType);
- }
- return parent::setDefault($default, $defaultType);
- }
- /**
- * Append a rule into the stack of rules.
- *
- * @return AbstractComposite
- */
- public function addRule(Validatable $rule): self
- {
- if ($this->shouldHaveNameOverwritten($rule) && $this->getName() !== null) {
- $rule->setName($this->getName());
- }
- $this->rules[] = $rule;
- return $this;
- }
- /**
- * Returns all the rules in the stack.
- *
- * @return Validatable[]
- */
- public function getRules(): array
- {
- return $this->rules;
- }
- /**
- * Returns all the exceptions throw when asserting all rules.
- *
- * @param mixed $input
- *
- * @return ValidationException[]
- */
- protected function getAllThrownExceptions($input): array
- {
- return array_filter(
- array_map(
- function (Validatable $rule) use ($input): ?ValidationException {
- try {
- $rule->assert($input);
- } catch (ValidationException $exception) {
- $this->updateExceptionTemplate($exception);
- return $exception;
- }
- return null;
- },
- $this->getRules()
- )
- );
- }
- private function shouldHaveNameOverwritten(Validatable $rule): bool
- {
- return $this->hasName($this) && !$this->hasName($rule);
- }
- private function hasName(Validatable $rule): bool
- {
- return $rule->getName() !== null;
- }
- private function updateExceptionTemplate(ValidationException $exception): void
- {
- if ($this->template === null || $exception->hasCustomTemplate()) {
- return;
- }
- $exception->updateTemplate($this->template);
- if (!$exception instanceof NestedValidationException) {
- return;
- }
- foreach ($exception->getChildren() as $childException) {
- $this->updateExceptionTemplate($childException);
- }
- }
- }
|