-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAbstractApplication.php
More file actions
234 lines (205 loc) · 4.93 KB
/
AbstractApplication.php
File metadata and controls
234 lines (205 loc) · 4.93 KB
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
<?php declare(strict_types=1);
/**
* Part of Windwalker project.
*
* @copyright Copyright (C) 2019 LYRASOFT.
* @license LGPL-2.0-or-later
*/
namespace Windwalker\Application;
use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerInterface;
use Psr\Log\NullLogger;
use Windwalker\Structure\Structure;
/**
* The Abstract Application Class.
*
* @property-read Structure $config
*
* @since 2.0
*/
abstract class AbstractApplication implements LoggerAwareInterface
{
/**
* The application configuration object.
*
* @var Structure
* @since 2.0
*/
protected $config;
/**
* A logger object.
*
* @var LoggerInterface
* @since 2.0
*/
protected $logger;
/**
* Class constructor of Application.
*
* @param Structure $config An optional argument to provide a Structure object to be config.
*
* @since 2.0
*/
public function __construct(Structure $config = null)
{
$this->config = $config instanceof Structure ? $config : new Structure();
$this->init();
}
/**
* Method to close the application.
*
* @param integer|string $message The exit code (optional; default is 0).
*
* @return void
*
* @since 2.0
*/
public function close($message = 0)
{
exit($message);
}
/**
* Method to run the application routines. Most likely you will want to instantiate a controller
* and execute it, or perform some sort of task directly.
*
* @return void
*
* @since 2.0
*/
abstract protected function doExecute();
/**
* Execute the application.
*
* @return mixed
*
* @since 2.0
*/
public function execute()
{
$this->prepareExecute();
// @event onBeforeExecute
// Perform application routines.
$this->doExecute();
// @event onAfterExecute
return $this->postExecute();
}
/**
* Prepare execute hook.
*
* @return void
*/
protected function prepareExecute()
{
}
/**
* Post execute hook.
*
* @return mixed
*/
protected function postExecute()
{
}
/**
* Returns a property of the object or the default value if the property is not set.
*
* @param string $key The name of the property.
* @param mixed $default The default value (optional) if none is set.
*
* @return mixed The value of the configuration.
*
* @since 2.0
*/
public function get($key, $default = null)
{
return $this->config->get($key, $default);
}
/**
* Get the logger.
*
* @return LoggerInterface
*
* @since 2.0
*/
public function getLogger()
{
// If a logger hasn't been set, use NullLogger
if (!($this->logger instanceof LoggerInterface)) {
$this->logger = new NullLogger();
}
return $this->logger;
}
/**
* Custom initialisation method.
*
* Called at the end of the AbstractApplication::__construct() method.
* This is for developers to inject initialisation code for their application classes.
*
* @return void
*
* @since 2.0
*/
protected function init()
{
}
/**
* Modifies a property of the object, creating it if it does not already exist.
*
* @param string $key The name of the property.
* @param mixed $value The value of the property to set (optional).
*
* @return mixed Previous value of the property
*
* @since 2.0
*/
public function set($key, $value = null)
{
$previous = $this->config->get($key);
$this->config->set($key, $value);
return $previous;
}
/**
* Sets the configuration for the application.
*
* @param Structure $config A structure object holding the configuration.
*
* @return AbstractApplication Returns itself to support chaining.
*
* @since 2.0
*/
public function setConfiguration(Structure $config)
{
$this->config = $config;
return $this;
}
/**
* Set the logger.
*
* @param LoggerInterface $logger The logger.
*
* @return AbstractApplication Returns itself to support chaining.
*
* @since 2.0
*/
public function setLogger(LoggerInterface $logger)
{
$this->logger = $logger;
return $this;
}
/**
* is utilized for reading data from inaccessible members.
*
* @param $name string
*
* @return mixed
*/
public function __get($name)
{
$allowNames = [
'config',
];
if (in_array($name, $allowNames)) {
return $this->$name;
}
throw new \UnexpectedValueException('Property: ' . $name . ' not found in ' . get_called_class());
}
}