‪TYPO3CMS  ‪main
AbstractGenericObjectValidator.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
22 
27 {
28  protected array ‪$propertyValidators = [];
29 
34 
41  public function ‪validate(mixed $value): ‪Result
42  {
43  if (is_object($value) && $this->‪isValidatedAlready($value)) {
44  return ‪$this->result;
45  }
46 
47  $this->result = new ‪Result();
48  if ($this->acceptsEmptyValues === false || $this->‪isEmpty($value) === false) {
49  if (!is_object($value)) {
50  $this->‪addError('Object expected, %1$s given.', 1241099149, [gettype($value)]);
51  } elseif ($this->‪isValidatedAlready($value) === false) {
52  $this->‪markInstanceAsValidated($value);
53  $this->‪isValid($value);
54  }
55  }
56 
57  return ‪$this->result;
58  }
59 
64  protected function ‪getPropertyValue(object $object, string $propertyName): mixed
65  {
66  if (‪ObjectAccess::isPropertyGettable($object, $propertyName)) {
67  return ‪ObjectAccess::getProperty($object, $propertyName);
68  }
69  throw new \RuntimeException(
70  sprintf(
71  'Could not get value of property "%s::%s", make sure the property is either public or has a getter get%3$s(), a hasser has%3$s() or an isser is%3$s().',
72  get_class($object),
73  $propertyName,
74  ucfirst($propertyName)
75  ),
76  1546632293
77  );
78  }
79 
84  protected function ‪checkProperty(mixed $value, \Traversable $validators, string $propertyName): void
85  {
87  ‪$result = null;
88  foreach ($validators as ‪$validator) {
89  if (‪$validator instanceof ObjectValidatorInterface) {
90  ‪$validator->setValidatedInstancesContainer($this->validatedInstancesContainer);
91  }
92  $currentResult = ‪$validator->validate($value);
93  if ($currentResult->hasMessages()) {
94  if (‪$result == null) {
95  ‪$result = $currentResult;
96  } else {
97  ‪$result->‪merge($currentResult);
98  }
99  }
100  }
101  if (‪$result != null) {
102  $this->result->forProperty($propertyName)->merge(‪$result);
103  }
104  }
105 
109  protected function ‪isValid(mixed $object): void
110  {
111  foreach ($this->propertyValidators as $propertyName => $validators) {
112  $propertyValue = $this->‪getPropertyValue($object, $propertyName);
113  $this->‪checkProperty($propertyValue, $validators, $propertyName);
114  }
115  }
116 
120  public function ‪canValidate(mixed $object): bool
121  {
122  return is_object($object);
123  }
124 
128  public function ‪addPropertyValidator(string $propertyName, ValidatorInterface ‪$validator): void
129  {
130  if (!isset($this->propertyValidators[$propertyName])) {
131  $this->propertyValidators[$propertyName] = new \SplObjectStorage();
132  }
133  $this->propertyValidators[$propertyName]->attach(‪$validator);
134  }
135 
136  protected function ‪isValidatedAlready(object $object): bool
137  {
138  if ($this->validatedInstancesContainer === null) {
139  $this->validatedInstancesContainer = new \SplObjectStorage();
140  }
141  if ($this->validatedInstancesContainer->contains($object)) {
142  return true;
143  }
144 
145  return false;
146  }
147 
148  protected function ‪markInstanceAsValidated(object $object): void
149  {
150  $this->validatedInstancesContainer->attach($object);
151  }
152 
156  public function ‪getPropertyValidators(string $propertyName = null): array
157  {
158  if ($propertyName !== null) {
159  return $this->propertyValidators[$propertyName] ?? [];
160  }
162  }
163 
167  public function ‪setValidatedInstancesContainer(\SplObjectStorage ‪$validatedInstancesContainer): void
168  {
169  $this->validatedInstancesContainer = ‪$validatedInstancesContainer;
170  }
171 }
‪TYPO3\CMS\Extbase\Validation\Validator\ObjectValidatorInterface
Definition: ObjectValidatorInterface.php:24
‪TYPO3\CMS\Extbase\Validation\Validator\AbstractValidator
Definition: AbstractValidator.php:29
‪TYPO3\CMS\Extbase\Validation\Validator\AbstractGenericObjectValidator\markInstanceAsValidated
‪markInstanceAsValidated(object $object)
Definition: AbstractGenericObjectValidator.php:147
‪TYPO3\CMS\Extbase\Reflection\ObjectAccess\getProperty
‪static mixed getProperty(object|array $subject, string $propertyName)
Definition: ObjectAccess.php:59
‪TYPO3\CMS\Extbase\Validation\Validator\AbstractGenericObjectValidator\$validatedInstancesContainer
‪SplObjectStorage $validatedInstancesContainer
Definition: AbstractGenericObjectValidator.php:32
‪TYPO3\CMS\Extbase\Validation\Validator\AbstractGenericObjectValidator\$propertyValidators
‪array $propertyValidators
Definition: AbstractGenericObjectValidator.php:28
‪TYPO3\CMS\Extbase\Validation\Validator\AbstractGenericObjectValidator\isValidatedAlready
‪isValidatedAlready(object $object)
Definition: AbstractGenericObjectValidator.php:135
‪TYPO3\CMS\Extbase\Validation\Validator\AbstractValidator\addError
‪addError(string $message, int $code, array $arguments=[], string $title='')
Definition: AbstractValidator.php:82
‪TYPO3\CMS\Extbase\Validation\Validator\AbstractGenericObjectValidator\isValid
‪isValid(mixed $object)
Definition: AbstractGenericObjectValidator.php:108
‪TYPO3\CMS\Extbase\Validation\Validator\AbstractGenericObjectValidator\addPropertyValidator
‪addPropertyValidator(string $propertyName, ValidatorInterface $validator)
Definition: AbstractGenericObjectValidator.php:127
‪TYPO3\CMS\Extbase\Validation\Validator\AbstractGenericObjectValidator\setValidatedInstancesContainer
‪setValidatedInstancesContainer(\SplObjectStorage $validatedInstancesContainer)
Definition: AbstractGenericObjectValidator.php:166
‪TYPO3\CMS\Extbase\Error\Result
Definition: Result.php:24
‪TYPO3\CMS\Extbase\Error\Result\merge
‪merge(Result $otherResult)
Definition: Result.php:409
‪TYPO3\CMS\Extbase\Reflection\ObjectAccess
Definition: ObjectAccess.php:39
‪TYPO3\CMS\Extbase\Validation\Validator\AbstractValidator\$result
‪Result $result
Definition: AbstractValidator.php:47
‪$validator
‪if(isset($args['d'])) $validator
Definition: validateRstFiles.php:262
‪TYPO3\CMS\Extbase\Validation\Validator\AbstractGenericObjectValidator\getPropertyValidators
‪getPropertyValidators(string $propertyName=null)
Definition: AbstractGenericObjectValidator.php:155
‪TYPO3\CMS\Extbase\Validation\Validator\AbstractGenericObjectValidator\checkProperty
‪checkProperty(mixed $value, \Traversable $validators, string $propertyName)
Definition: AbstractGenericObjectValidator.php:83
‪TYPO3\CMS\Extbase\Validation\Validator\AbstractGenericObjectValidator\validate
‪validate(mixed $value)
Definition: AbstractGenericObjectValidator.php:40
‪TYPO3\CMS\Extbase\Validation\Validator\AbstractGenericObjectValidator\getPropertyValue
‪getPropertyValue(object $object, string $propertyName)
Definition: AbstractGenericObjectValidator.php:63
‪TYPO3\CMS\Extbase\Validation\Validator\AbstractGenericObjectValidator
Definition: AbstractGenericObjectValidator.php:27
‪TYPO3\CMS\Extbase\Reflection\ObjectAccess\isPropertyGettable
‪static isPropertyGettable(object|array $object, string $propertyName)
Definition: ObjectAccess.php:335
‪TYPO3\CMS\Extbase\Validation\Validator
Definition: AbstractCompositeValidator.php:18
‪TYPO3\CMS\Extbase\Validation\Validator\AbstractGenericObjectValidator\canValidate
‪canValidate(mixed $object)
Definition: AbstractGenericObjectValidator.php:119
‪TYPO3\CMS\Extbase\Validation\Validator\ValidatorInterface
Definition: ValidatorInterface.php:26
‪TYPO3\CMS\Extbase\Validation\Validator\AbstractValidator\isEmpty
‪isEmpty(mixed $value)
Definition: AbstractValidator.php:114