/
AbstractAction.php
243 lines (212 loc) · 5.18 KB
/
AbstractAction.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
<?php
namespace ru\yukosh\actions;
/**
* AbstractAction class
*
* Provides common actions functionality
*
* @package Actions
*/
abstract class AbstractAction implements IAction, \SplSubject {
/**
* Stores action execution results
*
* @var mixed $_xResult
*/
private $_xResult = null;
/**
* Stores action call arguments
*
* @var array $_aArgs
*/
private $_aArgs = null;
/**
* Stores SplObjectStorage object
*
* @var object $_oObservers
*/
private $_oObservers;
/**
* Stores the time of invoking action
*
* @var integer $_iStartTime
*/
private $_iStartTime;
/**
* Stores the end time of invoking action
*
* @var integer $_iEndTime
*/
private $_iEndTime;
/**
* Indicates that Action is launched via web
*
* @var bool $_bHttpCall
*/
private $_bHttpCall = false;
/**
* Marks the debugging mode
*
* @var bool $_bDebug
*/
private static $_bDebug = false;
/**
* $_iStartTime property getter
*
* @return integer Time of invoking action
*/
public function getStartTime() {
return $this->_iStartTime;
}
/**
* $_iEndTime property getter
*
* @return integer End time of invoking action
*/
public function getEndTime() {
return $this->_iEndTime;
}
/**
* Sets results of action execution
*
* @return mixed False if no arguments passed, otherwise void
*/
protected final function setResult() {
$aArguments = func_get_args();
if (!$aArguments) {
return false;
}
elseif (count($aArguments) == 1) {
$this->_xResult = $aArguments[0];
}
else {
foreach ($aArguments as $iIndex => $xArg) {
$bIsParamName = !(($iIndex + 1) % 2 == 0);
if ($bIsParamName && isset($aArguments[$iIndex + 1])) {
$this->_xResult[$xArg] = $aArguments[$iIndex + 1];
}
}
}
}
/**
* Returns http-call status
*
* @return bool http-call status
*/
protected final function isHttpCall() {
return $this->_bHttpCall;
}
/**
* Clears Action execution result
*
* @return void
*/
protected final function clearResult() {
$this->_xResult = null;
}
/**
* Returns action execution results
*
* @return mixed Action execution results
*/
public final function getResult() {
$aArguments = func_get_args();
if (count($aArguments) > 0) {
if (count($aArguments) == 1) {
return (isset($this->_xResult[$aArguments[0]])) ? $this->_xResult[$aArguments[0]] : null;
}
if (count($aArguments) > 1) {
$aResult = [];
foreach ($aArguments as $sKey) {
if (isset($this->_xResult[$sKey])) {
$aResult[$sKey] = $this->_xResult[$sKey];
}
}
return $aResult;
}
}
return $this->_xResult;
}
/**
* $_aArgs property getter
*
* @return array Arguments array
*/
public final function getArgs() {
return $this->_aArgs;
}
/**
* Sets debugging mode
*
* @param bool $_bEnabled Enable or not debugging mode
*
* @return void
*/
public function setDebugMode($_bEnabled = true) {
self::$_bDebug = $_bEnabled;
}
/**
* Calls action
*
* @return Action object
*/
public final function call() {
$this->_aArgs = func_get_args();
if (self::$_bDebug) {
require_once 'ActionsLogger.php';
$this->_oObservers = new SplObjectStorage();
$this->attach(new ActionsLogger());
$this->_execDebug();
}
else {
$this->clearResult();
$this->exec();
}
return $this;
}
/**
* Calls action and marks call as http
* @return Action object
*/
public final function httpCall() {
$this->_bHttpCall = true;
call_user_func_array(array($this, 'call'), func_get_args());
}
/**
* Calls action in debug mode
* @return void
*/
private final function _execDebug() {
$this->_iStartTime = microtime(true);
$this->exec();
$this->_iEndTime = microtime(true);
$this->notify();
}
/**
* Attaches observer object
*
* @param \SplObserver $_oObserver Observer object
* @return void
*/
public function attach(\SplObserver $_oObserver) {
$this->_oObservers->attach($_oObserver);
}
/**
* Detaches observer object
*
* @param \SplObserver $_oObserver Observer object
* @return void
*/
public function detach(\SplObserver $_oObserver) {
$this->_oObservers->detach($_oObserver);
}
/**
* Notifies observers
* @return void
*/
public function notify() {
foreach ($this->_oObservers as $oObserver) {
$oObserver->update($this);
}
}
}