Test Failed
Push — master ( 74488a...9d98fe )
by Jean-Christophe
26:36
created

ValidatorsManager   A

Complexity

Total Complexity 36

Size/Duplication

Total Lines 182
Duplicated Lines 0 %

Test Coverage

Coverage 66.67%

Importance

Changes 1
Bugs 1 Features 0
Metric Value
wmc 36
eloc 102
c 1
b 1
f 0
dl 0
loc 182
rs 9.52
ccs 58
cts 87
cp 0.6667

10 Methods

Rating   Name   Duplication   Size   Complexity  
B validate_() 0 21 7
A getGroupArrayValidators() 0 9 3
A getGroupMemberValidators() 0 8 4
A getUIConstraints() 0 11 3
A validateInstances_() 0 13 5
A getCacheInfo() 0 2 1
A validateInstances() 0 13 3
A validate() 0 11 3
A getUIConstraints_() 0 19 6
A start() 0 2 1
1
<?php
2
3
namespace Ubiquity\contents\validation;
4
5
use Ubiquity\cache\CacheManager;
6
use Ubiquity\cache\objects\SessionCache;
7
use Ubiquity\contents\validation\traits\ValidatorsManagerInitTrait;
8
use Ubiquity\contents\validation\validators\basic\IsBooleanValidator;
9
use Ubiquity\contents\validation\validators\basic\IsEmptyValidator;
10
use Ubiquity\contents\validation\validators\basic\IsFalseValidator;
11
use Ubiquity\contents\validation\validators\basic\IsNullValidator;
12
use Ubiquity\contents\validation\validators\basic\IsTrueValidator;
13
use Ubiquity\contents\validation\validators\basic\NotEmptyValidator;
14
use Ubiquity\contents\validation\validators\basic\NotNullValidator;
15
use Ubiquity\contents\validation\validators\basic\TypeValidator;
16
use Ubiquity\contents\validation\validators\comparison\EqualsValidator;
17
use Ubiquity\contents\validation\validators\comparison\GreaterThanOrEqualValidator;
18
use Ubiquity\contents\validation\validators\comparison\GreaterThanValidator;
19
use Ubiquity\contents\validation\validators\comparison\LessThanOrEqualValidator;
20
use Ubiquity\contents\validation\validators\comparison\LessThanValidator;
21
use Ubiquity\contents\validation\validators\comparison\MatchWithValidator;
22
use Ubiquity\contents\validation\validators\comparison\RangeValidator;
23
use Ubiquity\contents\validation\validators\dates\DateTimeValidator;
24
use Ubiquity\contents\validation\validators\dates\DateValidator;
25
use Ubiquity\contents\validation\validators\dates\TimeValidator;
26
use Ubiquity\contents\validation\validators\multiples\IdValidator;
27
use Ubiquity\contents\validation\validators\multiples\LengthValidator;
28
use Ubiquity\contents\validation\validators\strings\EmailValidator;
29
use Ubiquity\contents\validation\validators\strings\IpValidator;
30
use Ubiquity\contents\validation\validators\strings\RegexValidator;
31
use Ubiquity\contents\validation\validators\strings\UrlValidator;
32
use Ubiquity\log\Logger;
33
use Ubiquity\contents\validation\traits\ValidatorsManagerCacheTrait;
34
35
/**
36
 * Validators manager
37
 *
38
 * Ubiquity\contents\validation$ValidatorsManager
39
 * This class is part of Ubiquity
40
 *
41
 * @author jcheron <[email protected]>
42
 * @version 1.0.4
43
 *
44
 */
45
class ValidatorsManager {
46
	use ValidatorsManagerInitTrait,ValidatorsManagerCacheTrait;
47
	protected static $instanceValidators = [ ];
48 6
49 6
	public static function start() {
50 6
		self::$cache = new SessionCache ();
51
	}
52
	public static $validatorTypes = [
53
										'notNull' => NotNullValidator::class,
54
										'isNull' => IsNullValidator::class,
55
										'notEmpty' => NotEmptyValidator::class,
56
										'isEmpty' => IsEmptyValidator::class,
57
										'isTrue' => IsTrueValidator::class,
58
										'isFalse' => IsFalseValidator::class,
59
										'isBool' => IsBooleanValidator::class,
60
										'equals' => EqualsValidator::class,
61
										'type' => TypeValidator::class,
62
										'greaterThan' => GreaterThanValidator::class,
63
										'greaterThanOrEqual' => GreaterThanOrEqualValidator::class,
64
										'lessThan' => LessThanValidator::class,
65
										'lessThanOrEqual' => LessThanOrEqualValidator::class,
66
										'length' => LengthValidator::class,
67
										'id' => IdValidator::class,
68
										'regex' => RegexValidator::class,
69
										'email' => EmailValidator::class,
70
										'url' => UrlValidator::class,
71
										'ip' => IpValidator::class,
72
										'range' => RangeValidator::class,
73
										'date' => DateValidator::class,
74
										'dateTime' => DateTimeValidator::class,
75
										'time' => TimeValidator::class,
76
										'match'=>MatchWithValidator::class
77
	];
78
79 38
80 38
81 38
	public static function getCacheInfo($model) {
82
		return self::fetch ( $model );
83 12
	}
84 12
85 12
	protected static function getGroupArrayValidators(array $validators, $group) {
86 12
		$result = [ ];
87
		foreach ( $validators as $member => $validators ) {
88
			$filteredValidators = self::getGroupMemberValidators ( $validators, $group );
89
			if (\count ( $filteredValidators ) > 0) {
90
				$result [$member] = $filteredValidators;
91 1
			}
92 1
		}
93
		return $result;
94
	}
95
96
	protected static function getGroupMemberValidators(array $validators, $group) {
97
		$result = [ ];
98
		foreach ( $validators as $validator ) {
99
			if (isset ( $validator ['group'] ) && $validator ['group'] === $group) {
100
				$result [] = $validator;
101
			}
102
		}
103
		return $result;
104
	}
105
106
107
	/**
108
	 * Validates an instance
109
	 *
110
	 * @param object $instance
111
	 * @param string $group
112
	 * @param array $excludedValidators
113
	 * @return \Ubiquity\contents\validation\validators\ConstraintViolation[]
114
	 */
115
	public static function validate($instance, $group = '', $excludedValidators = [ ]) {
116
		$class = \get_class ( $instance );
117
		$cache = self::getClassCacheValidators ( $class, $group );
118
		if ($cache !== false) {
119
			return self::validateFromCache_ ( $instance, $cache, $excludedValidators );
120 12
		}
121 12
		$members = self::fetch ( $class );
122 6
		if ($group !== '') {
123 6
			$members = self::getGroupArrayValidators ( $members, $group );
124
		}
125
		return self::validate_ ( $instance, $members, $excludedValidators );
126
	}
127 12
128
	/**
129
	 * Returns an array of UI rules for Javascript validation.
130
	 * @param $instance
131
	 * @param string $group
132
	 * @param array $excludedValidators
133
	 * @return array
134
	 */
135
	public static function getUIConstraints($instance, $group = '', $excludedValidators = [ ]) {
136
		$class = \get_class ( $instance );
137
		$cache = self::getClassCacheValidators ( $class, $group );
138 5
		if ($cache !== false) {
139 5
			return self::getUIConstraintsFromCache_ ( $instance, $cache, $excludedValidators );
140 5
		}
141 5
		$members = self::fetch ( $class );
142
		if ($group !== '') {
143
			$members = self::getGroupArrayValidators ( $members, $group );
144 5
		}
145 5
		return self::getUIConstraints_ ( $instance, $members, $excludedValidators );
146
	}
147
148 5
	/**
149
	 * Validates an array of objects
150
	 *
151
	 * @param array $instances
152
	 * @param string $group
153
	 * @return \Ubiquity\contents\validation\validators\ConstraintViolation[]
154
	 */
155
	public static function validateInstances($instances, $group = '') {
156
		if (\count ( $instances ) > 0) {
157
			$instance = \current ( $instances );
158 5
			$class = \get_class ( $instance );
159 5
			$cache = self::getClassCacheValidators ( $class, $group );
160 5
			if ($cache === false) {
161 5
				$members = self::fetch ( $class );
162
				self::initInstancesValidators ( $instance, $members, $group );
163
				$cache = self::$instanceValidators [$class];
164 5
			}
165 5
			return self::validateInstances_ ( $instances, $cache );
166
		}
167
		return [ ];
168 5
	}
169
170
	protected static function validateInstances_($instances, $members) {
171
		$result = [ ];
172
		foreach ( $instances as $instance ) {
173
			foreach ( $members as $accessor => $validators ) {
174
				foreach ( $validators as $validator ) {
175
					$valid = $validator->validate_ ( $instance->$accessor () );
176
					if ($valid !== true) {
177
						$result [] = $valid;
178 2
					}
179 2
				}
180 2
			}
181 2
		}
182 2
		return $result;
183 2
	}
184 2
185 2
	protected static function validate_($instance, $members, $excludedValidators = [ ]) {
186 2
		$result = [ ];
187
		foreach ( $members as $member => $validators ) {
188 2
			$accessor = 'get' . \ucfirst ( $member );
189
			if (\method_exists ( $instance, $accessor )) {
190
				foreach ( $validators as $validator ) {
191
					$typeV = $validator ['type'];
192
					if (! isset ( $excludedValidators [$typeV] )) {
193
						$validatorInstance = self::getValidatorInstance ( $typeV );
194
						if ($validatorInstance !== false) {
195
							$validatorInstance->setValidationParameters ( $member, $validator ['constraints'] ?? [ ], $validator ['severity'] ?? null, $validator ['message'] ?? null);
196
							$valid = $validatorInstance->validate_ ( $instance->$accessor () );
197
							if ($valid !== true) {
198
								$result [] = $valid;
199
							}
200
						}
201
					}
202
				}
203
			}
204 2
		}
205 2
		return $result;
206 2
	}
207 2
208 2
	protected static function getUIConstraints_($instance, $members, $excludedValidators = [ ]) {
209 2
		$result = [ ];
210 2
		foreach ( $members as $member => $validators ) {
211 1
			$result [$member]=[];
212
			$accessor = 'get' . \ucfirst ( $member );
213
			if (\method_exists ( $instance, $accessor )) {
214
				foreach ( $validators as $validator ) {
215
					$typeV = $validator ['type'];
216 2
					if (! isset ( $excludedValidators [$typeV] )) {
217
						$validatorInstance = self::getValidatorInstance ( $typeV );
218
						if ($validatorInstance !== false) {
219 5
							$validatorInstance->setValidationParameters ( $member, $validator ['constraints'] ?? [ ], $validator ['severity'] ?? null, $validator ['message'] ?? null);
220 5
							$result [$member] = \array_merge_recursive($result[$member],$validatorInstance->asUI ());
221 5
						}
222 5
					}
223 5
				}
224 5
			}
225 5
		}
226 5
		return $result;
227 5
	}
228 5
}
229
230