Completed
Push — master ( af6f2f...54d848 )
by Jean-Christophe
01:36
created

ModelParser::parse()   B

Complexity

Conditions 5
Paths 9

Size

Total Lines 28
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 28
rs 8.439
cc 5
eloc 25
nc 9
nop 1
1
<?php
2
3
namespace micro\orm\parser;
4
5
use micro\utils\JArray;
6
use micro\cache\ClassUtils;
7
8
class ModelParser {
9
	protected $global;
10
	protected $primaryKeys;
11
	protected $manytoOneMembers;
12
	protected $oneToManyMembers;
13
	protected $manyToManyMembers;
14
	protected $joinColumnMembers;
15
	protected $joinTableMembers;
16
	protected $nullableMembers=[ ];
17
	protected $notSerializableMembers=[ ];
18
	protected $fieldNames;
19
	protected $fieldTypes=[];
20
21
	public function parse($modelClass) {
22
		$instance=new $modelClass();
23
		$this->primaryKeys=Reflexion::getKeyFields($instance);
24
		$this->oneToManyMembers=Reflexion::getMembersAnnotationWithAnnotation($modelClass, "@oneToMany");
25
		$this->manytoOneMembers=Reflexion::getMembersNameWithAnnotation($modelClass, "@manyToOne");
26
		$this->manyToManyMembers=Reflexion::getMembersAnnotationWithAnnotation($modelClass, "@manyToMany");
27
		$this->joinColumnMembers=Reflexion::getMembersAnnotationWithAnnotation($modelClass, "@joinColumn");
28
		$this->joinTableMembers=Reflexion::getMembersAnnotationWithAnnotation($modelClass, "@joinTable");
29
		$properties=Reflexion::getProperties($instance);
30
		foreach ( $properties as $property ) {
31
			$propName=$property->getName();
32
			$this->fieldNames[$propName]=Reflexion::getFieldName($modelClass, $propName);
33
			$nullable=Reflexion::isNullable($modelClass, $propName);
34
			$serializable=Reflexion::isSerializable($modelClass, $propName);
35
			if ($nullable)
36
				$this->nullableMembers[]=$propName;
37
			if (!$serializable)
38
				$this->notSerializableMembers[]=$propName;
39
			$type=Reflexion::getAnnotationMember($modelClass, $propName, "@var");
40
			if($type===false){
41
				$type="string";
42
			}else{
43
				$type=$type->type;
44
			}
45
			$this->fieldTypes[$propName]=$type;
46
		}
47
		$this->global["#tableName"]=Reflexion::getTableName($modelClass);
48
	}
49
50
	public function __toString() {
51
		$result=$this->global;
52
		$result["#primaryKeys"]=$this->primaryKeys;
53
		$result["#manyToOne"]=$this->manytoOneMembers;
54
		$result["#fieldNames"]=$this->fieldNames;
55
		$result["#fieldTypes"]=$this->fieldTypes;
56
		$result["#nullable"]=$this->nullableMembers;
57
		$result["#notSerializable"]=$this->notSerializableMembers;
58
		foreach ( $this->oneToManyMembers as $member => $annotation ) {
59
			$result["#oneToMany"][$member]=$annotation->getPropertiesAndValues();
60
		}
61
		foreach ( $this->manyToManyMembers as $member => $annotation ) {
62
			$result["#manyToMany"][$member]=$annotation->getPropertiesAndValues();
63
		}
64
65
		foreach ( $this->joinTableMembers as $member => $annotation ) {
66
			$result["#joinTable"][$member]=$annotation->getPropertiesAndValues();
67
		}
68
69
		foreach ( $this->joinColumnMembers as $member => $annotation ) {
70
			$result["#joinColumn"][$member]=$annotation->getPropertiesAndValues();
71
			$result["#invertedJoinColumn"][$annotation->name]=[ "member" => $member,"className" => ClassUtils::cleanClassname($annotation->className) ];
72
		}
73
		return "return " . JArray::asPhpArray($result, "array") . ";";
74
	}
75
}
76