繼續了解Application.
1 /**
2 * Registers the errorHandler component as a PHP error handler.
3 * 注冊errorHandler組件作為PHP錯誤處理函數
4 * @param array $config application config 應用程序配置
5 */
6 protected function registerErrorHandler(&$config)
7 {
8 if (YII_ENABLE_ERROR_HANDLER) {// YII_ENABLE_ERROR_HANDLER在BaseYii中被定義為true
9 if (!isset($config['components']['errorHandler']['class'])) {
10 //$config['components']['errorHandler']['class']不存在結束運行
11 echo "Error: no errorHandler component is configured.\n";
12 exit(1);
13 }
14 //將$config['components']['errorHandler']的內容設置到了$this->_definitions['errorHandler']中
15 $this->set('errorHandler', $config['components']['errorHandler']);
16 unset($config['components']['errorHandler']);// 刪除掉配置內容
17 $this->getErrorHandler()->register();
18 }
19 }
20
21 /**
22 * Returns an ID that uniquely identifies this module among all modules within the current application.
23 * Since this is an application instance, it will always return an empty string.
24 * 返回在當前應用程序中該模塊的唯一標識。這是一個應用實例,它將返回一個空字符串。
25 * @return string the unique ID of the module.模塊的唯一標識。
26 */
27 public function getUniqueId()
28 {
29 return '';
30 }
31
32 /**
33 * Sets the root directory of the application and the @app alias.設置應用程序的根目錄 @ 加應用程序別名。
34 * This method can only be invoked at the beginning of the constructor.只能在構造函數開始時調用該方法
35 * @param string $path the root directory of the application.應用程序的根目錄。
36 * @property string the root directory of the application. 應用程序的根目錄。
37 * @throws InvalidParamException if the directory does not exist. 如果目錄不存在。拋出異常
38 */
39 public function setBasePath($path)
40 {
41 parent::setBasePath($path);
42 // 使用@app來記錄basePath
43 Yii::setAlias('@app', $this->getBasePath());
44 }
45
46 /**
47 * Runs the application. 運行應用程序。
48 * This is the main entrance of an application. 應用程序的主要入口。
49 * @return integer the exit status (0 means normal, non-zero values mean abnormal) 狀態(0正常,非0為不正常)
50 */
51 public function run()
52 {
53 try {
54
55 $this->state = self::STATE_BEFORE_REQUEST;
56 $this->trigger(self::EVENT_BEFORE_REQUEST);//加載事件函數beforRequest函數
57
58 $this->state = self::STATE_HANDLING_REQUEST;
59 $response = $this->handleRequest($this->getRequest());//加載控制器 獲取Request對象
60
61 $this->state = self::STATE_AFTER_REQUEST;
62 $this->trigger(self::EVENT_AFTER_REQUEST);//加載afterRequest事件函數
63
64 $this->state = self::STATE_SENDING_RESPONSE;
65 $response->send();//將頁面內容輸入緩沖,然後輸出
66
67 $this->state = self::STATE_END;
68
69 return $response->exitStatus;
70
71 } catch (ExitException $e) {
72
73 $this->end($e->statusCode, isset($response) ? $response : null);
74 return $e->statusCode;
75
76 }
77 }
78
79 /**
80 * Handles the specified request.
81 * 處理指定的請求
82 * This method should return an instance of [[Response]] or its child class
83 * which represents the handling result of the request.
84 * 該方法應該返回一個[[Response]]實例,或者它的子類代表處理請求的結果
85 * @param Request $request the request to be handled 被處理的請求
86 * @return Response the resulting response 得到的響應
87 */
88 abstract public function handleRequest($request);
89
90 private $_runtimePath;
91
92 /**
93 * Returns the directory that stores runtime files.返回存儲運行時文件的路徑
94 * @return string the directory that stores runtime files.存儲運行時文件的目錄。
95 * Defaults to the "runtime" subdirectory under [[basePath]].默認返回[[basePath]]下的 "runtime"目錄
96 */
97 public function getRuntimePath()
98 {
99 if ($this->_runtimePath === null) {//設置臨時文件存儲路徑
100 $this->setRuntimePath($this->getBasePath() . DIRECTORY_SEPARATOR . 'runtime');
101 }
102
103 return $this->_runtimePath;
104 }
105
106 /**
107 * Sets the directory that stores runtime files.設置存儲運行時文件的路徑
108 * @param string $path the directory that stores runtime files.存儲運行時文件的目錄。
109 */
110 public function setRuntimePath($path)
111 {
112 // 獲取runtimePath的路徑,並存到_runtimePath中
113 $this->_runtimePath = Yii::getAlias($path);
114 // 使用@runtime來記錄 runtimePath
115 Yii::setAlias('@runtime', $this->_runtimePath);
116 }
117
118 private $_vendorPath;
119
120 /**
121 * Returns the directory that stores vendor files.返回插件文件的目錄。
122 * @return string the directory that stores vendor files.
123 * Defaults to "vendor" directory under [[basePath]].
124 * 默認返回[[basePath]]下的 "vendor" 目錄
125 */
126 public function getVendorPath()
127 {
128 if ($this->_vendorPath === null) {
129 // 不存在,就將其設置為basePath/vendor
130 $this->setVendorPath($this->getBasePath() . DIRECTORY_SEPARATOR . 'vendor');
131 }
132
133 return $this->_vendorPath;
134 }
135
136 /**
137 * Sets the directory that stores vendor files.設置插件目錄路徑,並設置別名
138 * @param string $path the directory that stores vendor files.
139 */
140 public function setVendorPath($path)
141 {
142 $this->_vendorPath = Yii::getAlias($path);// 獲取vendor的路徑,並存到_vendorPath中
143 Yii::setAlias('@vendor', $this->_vendorPath);// 設置@vendor的alias
144 Yii::setAlias('@bower', $this->_vendorPath . DIRECTORY_SEPARATOR . 'bower');
145 Yii::setAlias('@npm', $this->_vendorPath . DIRECTORY_SEPARATOR . 'npm');
146 }
147
148 /**
149 * Returns the time zone used by this application.取得時區
150 * This is a simple wrapper of PHP function date_default_timezone_get().
151 * If time zone is not configured in php.ini or application config,
152 * it will be set to UTC by default.
153 * @return string the time zone used by this application.
154 * @see http://php.net/manual/en/function.date-default-timezone-get.php
155 */
156 public function getTimeZone()
157 {
158 return date_default_timezone_get();
159 }
160
161 /**
162 * Sets the time zone used by this application.設置時區
163 * This is a simple wrapper of PHP function date_default_timezone_set().
164 * Refer to the [php manual](http://www.php.net/manual/en/timezones.php) for available timezones.
165 * @param string $value the time zone used by this application.
166 * @see http://php.net/manual/en/function.date-default-timezone-set.php
167 */
168 public function setTimeZone($value)
169 {
170 date_default_timezone_set($value);
171 }
172
173 /**
174 * Returns the database connection component.返回數據庫連接組件
175 * @return \yii\db\Connection the database connection.
176 */
177 public function getDb()
178 {
179 return $this->get('db');
180 }
181
182 /**
183 * Returns the log dispatcher component.返回日志調度組件
184 * @return \yii\log\Dispatcher the log dispatcher application component.
185 */
186 public function getLog()
187 {
188 return $this->get('log');
189 }
190
191 /**
192 * Returns the error handler component.返回錯誤處理組件
193 * @return \yii\web\ErrorHandler|\yii\console\ErrorHandler the error handler application component.
194 */
195 public function getErrorHandler()
196 {
197 return $this->get('errorHandler');
198 }
199
200 /**
201 * Returns the cache component.返回緩存組件
202 * @return \yii\caching\Cache the cache application component. Null if the component is not enabled.
203 */
204 public function getCache()
205 {
206 return $this->get('cache', false);
207 }
208
209 /**
210 * Returns the formatter component.返回格式化程序組件
211 * @return \yii\i18n\Formatter the formatter application component.
212 */
213 public function getFormatter()
214 {
215 return $this->get('formatter');
216 }
217
218 /**
219 * Returns the request component.返回請求的組件對象
220 * @return \yii\web\Request|\yii\console\Request the request component.
221 */
222 public function getRequest()
223 {
224 return $this->get('request');
225 }
226
227 /**
228 * Returns the response component.返回響應組件
229 * @return \yii\web\Response|\yii\console\Response the response component.
230 */
231 public function getResponse()
232 {
233 return $this->get('response');
234 }
235
236 /**
237 * Returns the view object.返回視圖對象
238 * @return View|\yii\web\View the view application component that is used to render various view files.
239 */
240 public function getView()
241 {
242 return $this->get('view');
243 }
244
245 /**
246 * Returns the URL manager for this application.返回當前應用的URL管理組件
247 * @return \yii\web\UrlManager the URL manager for this application.
248 */
249 public function getUrlManager()
250 {
251 return $this->get('urlManager');
252 }
253
254 /**
255 * Returns the internationalization (i18n) component返回國際化組件
256 * @return \yii\i18n\I18N the internationalization application component.
257 */
258 public function getI18n()
259 {
260 return $this->get('i18n');
261 }
262
263 /**
264 * Returns the mailer component.返回郵件組件
265 * @return \yii\mail\MailerInterface the mailer application component.
266 */
267 public function getMailer()
268 {
269 return $this->get('mailer');
270 }
271
272 /**
273 * Returns the auth manager for this application.返回該應用的權限管理組件
274 * @return \yii\rbac\ManagerInterface the auth manager application component.
275 * Null is returned if auth manager is not configured. 管理權限沒有配置返回null
276 */
277 public function getAuthManager()
278 {
279 return $this->get('authManager', false);
280 }
281
282 /**
283 * Returns the asset manager.返回資源管理組件
284 * @return \yii\web\AssetManager the asset manager application component.
285 */
286 public function getAssetManager()
287 {
288 return $this->get('assetManager');
289 }
290
291 /**
292 * Returns the security component.返回安全組件
293 * @return \yii\base\Security the security application component.
294 */
295 public function getSecurity()
296 {
297 return $this->get('security');
298 }
299
300 /**
301 * Returns the configuration of core application components.返回核心組件的配置
302 * @see set()
303 */
304 public function coreComponents()
305 {
306 return [
307 'log' => ['class' => 'yii\log\Dispatcher'],
308 'view' => ['class' => 'yii\web\View'],
309 'formatter' => ['class' => 'yii\i18n\Formatter'],
310 'i18n' => ['class' => 'yii\i18n\I18N'],
311 'mailer' => ['class' => 'yii\swiftmailer\Mailer'],
312 'urlManager' => ['class' => 'yii\web\UrlManager'],
313 'assetManager' => ['class' => 'yii\web\AssetManager'],
314 'security' => ['class' => 'yii\base\Security'],
315 ];
316 }
317
318 /**
319 * Terminates the application.終止應用程序
320 * This method replaces the `exit()` function by ensuring the application life cycle is completed
321 * before terminating the application.該方法代替`exit()` 確認一個應用的生命周期已經結束
322 * @param integer $status the exit status (value 0 means normal exit while other values mean abnormal exit).
323 * @param Response $response the response to be sent. If not set, the default application [[response]] component will be used.
324 * @throws ExitException if the application is in testing mode
325 */
326 public function end($status = 0, $response = null)
327 {
328 if ($this->state === self::STATE_BEFORE_REQUEST || $this->state === self::STATE_HANDLING_REQUEST) {
329 //判斷當前狀態為請求前或者處理請求
330 $this->state = self::STATE_AFTER_REQUEST;//設置應用狀態為請求完成後
331 $this->trigger(self::EVENT_AFTER_REQUEST);
332 }
333
334 if ($this->state !== self::STATE_SENDING_RESPONSE && $this->state !== self::STATE_END) {
335 //如果應用狀態不是發送應答和應用結束
336 $this->state = self::STATE_END;//設置狀態為應用結束
337 $response = $response ? : $this->getResponse();
338 $response->send();//向客戶端發送應答
339 }
340
341 if (YII_ENV_TEST) {
342 throw new ExitException($status);
343 } else {
344 exit($status);
345 }
346 }
php