Completed
Push — master ( 997533...5f070c )
by Jean-Christophe
01:37
created

OrmUtils::getModelMetadata()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 6
rs 10
c 0
b 0
f 0
cc 2
nc 2
nop 1
1
<?php
2
3
namespace Ubiquity\orm;
4
5
use Ubiquity\orm\parser\Reflexion;
6
use Ubiquity\cache\CacheManager;
7
use Ubiquity\utils\base\UString;
8
use Ubiquity\utils\base\UArray;
9
use Ubiquity\controllers\rest\ResponseFormatter;
10
use Ubiquity\orm\traits\OrmUtilsRelationsTrait;
11
use Ubiquity\orm\traits\OrmUtilsFieldsTrait;
12
13
/**
14
 * Object/relational mapping utilities
15
 * @author jc
16
 * @version 1.0.2
17
 */
18
class OrmUtils {
19
	
20
	use OrmUtilsFieldsTrait,OrmUtilsRelationsTrait;
21
	
22
	private static $modelsMetadatas;
23
24
	public static function getModelMetadata($className) {
25
		if (!isset(self::$modelsMetadatas[$className])) {
26
			self::$modelsMetadatas[$className]=CacheManager::getOrmModelCache($className);
27
		}
28
		return self::$modelsMetadatas[$className];
29
	}
30
31
	public static function isSerializable($class, $member) {
32
		return !self::_is($class, $member, "#notSerializable");
33
	}
34
35
	public static function isNullable($class, $member) {
36
		return self::_is($class, $member, "#nullable");
37
	}
38
	
39
	protected static function _is($class,$member,$like){
40
		$ret=self::getAnnotationInfo($class, $like);
41
		if ($ret !== false){
42
			return \array_search($member, $ret) !== false;
43
		}
44
		return false;
45
	}
46
47
	public static function getFieldName($class, $member) {
48
		$ret=self::getAnnotationInfo($class, "#fieldNames");
49
		if ($ret === false || !isset($ret[$member])){
50
			return $member;
51
		}
52
		return $ret[$member];
53
	}
54
55
	public static function getTableName($class) {
56
		if(isset(self::getModelMetadata($class)["#tableName"]))
57
		return self::getModelMetadata($class)["#tableName"];
58
	}
59
	
60
	public static function getKeyFieldsAndValues($instance) {
61
		$kf=self::getAnnotationInfo(get_class($instance), "#primaryKeys");
62
		return self::getMembersAndValues($instance, $kf);
63
	}
64
65
	public static function getMembers($className) {
66
		$fieldNames=self::getAnnotationInfo($className, "#fieldNames");
67
		if ($fieldNames !== false)
68
			return \array_keys($fieldNames);
69
		return [ ];
70
	}
71
72
	public static function getMembersAndValues($instance, $members=NULL) {
73
		$ret=array ();
74
		$className=get_class($instance);
75
		if (is_null($members))
76
			$members=self::getMembers($className);
77
		foreach ( $members as $member ) {
78
			if (self::isSerializable($className, $member)) {
79
				$v=Reflexion::getMemberValue($instance, $member);
80 View Code Duplication
				if (self::isNotNullOrNullAccepted($v, $className, $member)) {
81
					$name=self::getFieldName($className, $member);
82
					$ret[$name]=$v;
83
				}
84
			}
85
		}
86
		return $ret;
87
	}
88
89
	public static function isNotNullOrNullAccepted($v, $className, $member) {
90
		$notNull=UString::isNotNull($v);
91
		return ($notNull) || (!$notNull && self::isNullable($className, $member));
92
	}
93
94
	public static function getFirstKeyValue($instance) {
95
		$fkv=self::getKeyFieldsAndValues($instance);
96
		return \reset($fkv);
97
	}
98
	
99
	public static function getKeyValues($instance) {
100
		$fkv=self::getKeyFieldsAndValues($instance);
101
		return implode("_",$fkv);
102
	}
103
104
	public static function getMembersWithAnnotation($class, $annotation) {
105
		if (isset(self::getModelMetadata($class)[$annotation]))
106
			return self::getModelMetadata($class)[$annotation];
107
		return [ ];
108
	}
109
110
	/**
111
	 *
112
	 * @param object $instance
113
	 * @param string $memberKey
114
	 * @param array $array
115
	 * @return boolean
116
	 */
117
	public static function exists($instance, $memberKey, $array) {
118
		$accessor="get" . ucfirst($memberKey);
119
		if (method_exists($instance, $accessor)) {
120
			if ($array !== null) {
121
				foreach ( $array as $value ) {
122
					if ($value->$accessor() == $instance->$accessor())
123
						return true;
124
				}
125
			}
126
		}
127
		return false;
128
	}
129
130
	public static function getAnnotationInfo($class, $keyAnnotation) {
131
		if (isset(self::getModelMetadata($class)[$keyAnnotation]))
132
			return self::getModelMetadata($class)[$keyAnnotation];
133
		return false;
134
	}
135
136
	public static function getAnnotationInfoMember($class, $keyAnnotation, $member) {
137
		$info=self::getAnnotationInfo($class, $keyAnnotation);
138
		if ($info !== false) {
139
			if(UArray::isAssociative($info)){
140
				if (isset($info[$member])) {
141
					return $info[$member];
142
				}
143
			}else{
144
				if(\array_search($member, $info)!==false){
145
					return $member;
146
				}
147
			}
148
		}
149
		return false;
150
	}
151
152
	public static function setFieldToMemberNames(&$fields,$relFields){
153
		foreach ($fields as $index=>$field){
154
			if(isset($relFields[$field])){
155
				$fields[$index]=$relFields[$field];
156
			}
157
		}
158
	}
159
160
	public static function objectAsJSON($instance){
161
		$formatter=new ResponseFormatter();
162
		$datas=$formatter->cleanRestObject($instance);
163
		return $formatter->format(["pk"=>self::getFirstKeyValue($instance),"object"=>$datas]);
164
	}
165
}
166