Passed
Push — master ( 8220c0...484027 )
by Jean-Christophe
09:22
created

TransformersManager::registerClassAndSave()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
eloc 3
dl 0
loc 4
ccs 0
cts 4
cp 0
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 2
crap 2
1
<?php
2
3
namespace Ubiquity\contents\transformation;
4
5
use Ubiquity\cache\CacheManager;
6
use Ubiquity\contents\transformation\transformers\DateTime;
7
use Ubiquity\contents\transformation\transformers\FirstUpperCase;
8
use Ubiquity\contents\transformation\transformers\LowerCase;
9
use Ubiquity\contents\transformation\transformers\Md5;
10
use Ubiquity\contents\transformation\transformers\Password;
11
use Ubiquity\contents\transformation\transformers\UpperCase;
12
use Ubiquity\orm\DAO;
13
use Ubiquity\orm\OrmUtils;
14
use Ubiquity\utils\base\UArray;
15
16
/**
17
 * Transform objects after loading
18
 *
19
 * Ubiquity\contents\transformation\transformers$TransformersManager
20
 * This class is part of Ubiquity
21
 *
22
 * @author jcheron <[email protected]>
23
 * @version 1.0.2
24
 *
25
 */
26
class TransformersManager {
27
	const TRANSFORMER_TYPES = [ 'transform' => TransformerInterface::class,'toView' => TransformerViewInterface::class,'toForm' => TransformerFormInterface::class ];
28
	/**
29
	 *
30
	 * @var array|mixed
31
	 */
32
	private static $transformers = [ 'md5' => Md5::class,'datetime' => DateTime::class,'upper' => UpperCase::class,'firstUpper' => FirstUpperCase::class,'lower' => LowerCase::class,'password' => Password::class ];
33
	private static $key = 'contents/transformers';
34
35
	/**
36
	 * Load all transformers.
37
	 * Do not use at runtime !
38
	 */
39 18
	public static function start() {
40 18
		if (CacheManager::$cache->exists ( self::$key )) {
41
			self::$transformers = \array_merge ( self::$transformers, CacheManager::$cache->fetch ( self::$key ) );
42
		}
43 18
		if (\class_exists ( '\\Ubiquity\\security\\csrf\\CsrfManager' )) {
44
			self::$transformers ['crypt'] = '\\Ubiquity\\contents\\transformation\\transformers\\Crypt';
45
		}
46 18
	}
47
48
	/**
49
	 * Start the manager for production.
50
	 *
51
	 * @param ?string $op
52
	 */
53 4
	public static function startProd(?string $op = 'transform'): void {
54 4
		DAO::$useTransformers = true;
55 4
		DAO::$transformerOp = $op;
56 4
	}
57
58
	/**
59
	 * Register a new transformer class.
60
	 * Do not used at runtime !
61
	 *
62
	 * @param string $transformer
63
	 * @param string $classname
64
	 */
65
	public static function registerClass(string $transformer, string $classname): void {
66
		self::$transformers [$transformer] = $classname;
67
	}
68
69
	/**
70
	 * Register and save in cache a new Transformer.
71
	 * Do not used at runtime !
72
	 *
73
	 * @param string $transformer
74
	 * @param string $classname
75
	 */
76
	public static function registerClassAndSave(string $transformer, string $classname): void {
77
		self::start ();
78
		self::registerClass ( $transformer, $classname );
79
		self::store ();
80
	}
81
82
	/**
83
	 * Register an associative array of transformers based on ['name'=>'transformerClass'].
84
	 * Do not used at runtime !
85
	 *
86
	 * @param array $transformersAndClasses
87
	 */
88
	public static function registerClasses(array $transformersAndClasses): void {
89
		foreach ( $transformersAndClasses as $transformer => $class ) {
90
			self::registerClass ( $transformer, $class );
91
		}
92
	}
93
94
	/**
95
	 * Register and save an associative array of transformers based on ['name'=>'transformerClass'].
96
	 * Do not used at runtime !
97
	 *
98
	 * @param array $transformersAndClasses
99
	 */
100
	public static function registerClassesAndSave(array $transformersAndClasses): void {
101
		self::start ();
102
		foreach ( $transformersAndClasses as $transformer => $class ) {
103
			self::registerClass ( $transformer, $class );
104
		}
105
		self::store ();
106
	}
107
108
	/**
109
	 * Return the class from a transformer name.
110
	 *
111
	 * @param string $transformer
112
	 * @return ?string
113
	 */
114 18
	public static function getTransformerClass(string $transformer): ?string {
115 18
		if (isset ( self::$transformers [$transformer] )) {
116 18
			return self::$transformers [$transformer];
117
		}
118
		return null;
119
	}
120
121
	/**
122
	 * Transform a member of an instance.
123
	 *
124
	 * @param object $instance
125
	 * @param string $member
126
	 * @param string $transform
127
	 * @return ?mixed
128
	 */
129 1
	public static function transform(object $instance, string $member, ?string $transform = 'transform') {
130 1
		$getter = 'get' . $member;
131 1
		if (\method_exists ( $instance, $getter )) {
132 1
			return self::applyTransformer ( $instance, $member, $instance->{$getter} (), $transform );
133
		}
134
		return null;
135
	}
136
137
	/**
138
	 * Apply a transformer using a member transformer(s) on a value.
139
	 *
140
	 * @param object $instance
141
	 * @param string $member
142
	 * @param mixed $value
143
	 * @param string $transform
144
	 * @return mixed
145
	 */
146 1
	public static function applyTransformer(object $instance, string $member, $value, ?string $transform = 'transform') {
147 1
		$class = \get_class ( $instance );
148 1
		$metas = OrmUtils::getModelMetadata ( $class );
149 1
		if (isset ( $metas ['#transformers'] [$transform] [$member] )) {
150 1
			$transformer = $metas ['#transformers'] [$transform] [$member];
151 1
			return $transformer::$transform ( $value );
152
		}
153
		return $value;
154
	}
155
156
	/**
157
	 * Transform all the members of a model instance.
158
	 *
159
	 * @param object $instance
160
	 * @param string $transform
161
	 */
162 1
	public static function transformInstance(object $instance, $transform = 'transform'): void {
163 1
		$class = \get_class ( $instance );
164 1
		$metas = OrmUtils::getModelMetadata ( $class );
165 1
		$transformers = $metas ['#transformers'] [$transform] ?? [ ];
166 1
		foreach ( $transformers as $member => $transformer ) {
167 1
			$getter = 'get' . ucfirst ( $member );
168 1
			$setter = 'set' . ucfirst ( $member );
169 1
			if (\method_exists ( $instance, $getter )) {
170 1
				$value = $transformer::$transform ( $instance->{$getter} () );
171 1
				if (\method_exists ( $instance, $setter )) {
172 1
					$instance->{$setter} ( $value );
173
				}
174 1
				$instance->_rest [$member] = $value;
175
			}
176
		}
177 1
	}
178
179
	/**
180
	 * Store the loaded transformers in cache.
181
	 */
182
	public static function store(): void {
183
		CacheManager::$cache->store ( self::$key, "return " . UArray::asPhpArray ( self::$transformers, 'array' ) . ';' );
184
	}
185
}
186
187