1
+ <?php
2
+
3
+
4
+ namespace GrapheneNodeClient \Commands ;
5
+
6
+
7
+ class CommandQueryData implements CommandQueryDataInterface
8
+ {
9
+ /** @var array */
10
+ protected $ params = [];
11
+
12
+ /**
13
+ * @return array
14
+ */
15
+ public function getParams ()
16
+ {
17
+ return $ this ->params ;
18
+ }
19
+
20
+ /**
21
+ * @param $params
22
+ */
23
+ public function setParams ($ params )
24
+ {
25
+ $ this ->params = $ params ;
26
+ }
27
+
28
+ /**
29
+ * set value in params by key
30
+ *
31
+ * $setKey example: 'key:1:one_more_key' => $params['key'][1]['one_more_key']
32
+ * $setKey example: 'key:a1' => $params['key']['a1']
33
+ *
34
+ * @param string $setKey
35
+ * @param mixed $setVal
36
+ */
37
+ public function setParamByKey ($ setKey , $ setVal )
38
+ {
39
+ $ this ->setArrayElementByKey ($ this ->params , $ setKey , $ setVal );
40
+ }
41
+
42
+ /**
43
+ * @param CommandInterface $command
44
+ * @return array
45
+ */
46
+ public function getCommandData (CommandInterface $ command )
47
+ {
48
+ $ queryData = [];
49
+ $ map = $ command ->getDataMap ();
50
+ foreach ($ map as $ route => $ rules ) {
51
+ $ this ->setQueryDataForRoute ($ queryData , $ route , $ rules );
52
+ }
53
+
54
+ return $ queryData ;
55
+ }
56
+
57
+
58
+ /**
59
+ * @param array $data
60
+ * @param string $route
61
+ * @param array $rules
62
+ * @throws CommandQueryDataException
63
+ */
64
+ protected function setQueryDataForRoute (&$ data , $ route , $ rules = [])
65
+ {
66
+ $ errors = [];
67
+ $ routeParts = explode (': ' , $ route );
68
+ $ values = self ::getParamsListByKey ($ this ->params , $ routeParts );
69
+
70
+ foreach ($ values as $ route => $ value ) {
71
+ foreach ($ rules as $ rule ) {
72
+ if (!$ this ->validate ($ value , $ rule )) {
73
+ $ errors [] = 'Validation rule \'{$route} \' was failed for \'{$route} \'; ' ;
74
+ }
75
+ }
76
+ if ($ value !== null ) {
77
+ $ this ->setArrayElementByKey ($ data , $ route , $ value );
78
+ }
79
+ }
80
+
81
+ if (!empty ($ errors )) {
82
+ throw new CommandQueryDataException (implode (PHP_EOL , $ errors ));
83
+ }
84
+ }
85
+
86
+
87
+ protected function validate ($ value , $ rule )
88
+ {
89
+ if ($ rule === 'required ' ) {
90
+ return $ value === null ? false : true ;
91
+ } elseif ($ rule === 'array ' ) {
92
+ return $ value !== null && is_array ($ value );
93
+ } elseif ($ rule === 'string ' ) {
94
+ return $ value !== null && is_string ($ value );
95
+ } elseif ($ rule === 'integer ' ) {
96
+ return $ value !== null && is_integer ($ value );
97
+ } elseif ($ rule === 'nullOrArray ' ) {
98
+ return $ value === null || is_array ($ value );
99
+ } elseif ($ rule === 'nullOrString ' ) {
100
+ return $ value === null || is_string ($ value );
101
+ } elseif ($ rule === 'nullOrInteger ' ) {
102
+ return $ value === null || is_integer ($ value );
103
+ }
104
+ }
105
+
106
+
107
+ protected static function getParamsListByKey ($ params , $ routeParts = [])
108
+ {
109
+ $ values = [];
110
+ if (empty ($ routeParts )) {
111
+ $ values [] = $ params ;
112
+ } else {
113
+ $ currentKeyPart = array_shift ($ routeParts );
114
+ if (
115
+ is_numeric ($ currentKeyPart )
116
+ && (string )((integer )$ currentKeyPart ) === $ currentKeyPart
117
+ ) {
118
+ $ currentKeyPart = (integer )$ currentKeyPart ;
119
+ }
120
+ if (isset ($ params [$ currentKeyPart ])) {
121
+ foreach (self ::getParamsListByKey ($ params [$ currentKeyPart ], $ routeParts ) as $ valueKey => $ value ) {
122
+ $ values [$ currentKeyPart . ': ' . $ valueKey ] = $ value ;
123
+ }
124
+ } elseif (is_array ($ params ) && $ currentKeyPart === '* ' ) {
125
+ foreach ($ params as $ paramKey => $ param ) {
126
+ foreach (self ::getParamsListByKey ($ param , $ routeParts ) as $ valueKey => $ value ) {
127
+ $ values [$ paramKey . ': ' . $ valueKey ] = $ value ;
128
+ }
129
+ }
130
+ } else {
131
+ $ values [implode (': ' , array_merge ([$ currentKeyPart ], $ routeParts ))] = null ;
132
+ }
133
+ }
134
+
135
+ return $ values ;
136
+ }
137
+
138
+
139
+ /**
140
+ * set value in array by key
141
+ *
142
+ * $setKey example: 'key:123:array' => $_SESSION['key'][123]['array']
143
+ *
144
+ * @param array $array
145
+ * @param string $setKey
146
+ * @param mixed $setVal
147
+ *
148
+ * @return array
149
+ */
150
+ protected function setArrayElementByKey (&$ array , $ setKey , $ setVal )
151
+ {
152
+ $ link = $ array ;
153
+ $ keyParts = explode (': ' , $ setKey );
154
+ foreach ($ keyParts as $ key ) {
155
+ if (
156
+ is_numeric ($ key )
157
+ && (string )((integer )$ key ) === $ key
158
+ ) {
159
+ $ key = (integer )$ key ;
160
+ }
161
+ if (!isset ($ link [$ key ])) {
162
+ $ link [$ key ] = [];
163
+ }
164
+ $ link = &$ link [$ key ];
165
+ }
166
+ $ link = $ setVal ;
167
+
168
+ return $ array ;
169
+ }
170
+ }
0 commit comments