Heim >php教程 >php手册 >yii2源码学习笔记(九),yii2源码学习笔记

yii2源码学习笔记(九),yii2源码学习笔记

WBOY
WBOYOriginal
2016-06-13 08:38:45886Durchsuche

yii2源码学习笔记(九),yii2源码学习笔记

Application是所有应用程序类的基类,接下来了解一下它的源码。yii2\base\Application.php。

<span>  1</span> <?<span>php
</span><span>  2</span> <span>/*</span><span>*
</span><span>  3</span> <span> * @link </span><span>http://www.yiiframework.com/</span>
<span>  4</span> <span> * @copyright Copyright (c) 2008 Yii Software LLC
</span><span>  5</span> <span> * @license </span><span>http://www.yiiframework.com/license/</span>
<span>  6</span>  <span>*/</span>
<span>  7</span> 
<span>  8</span> <span>namespace</span> yii\<span>base</span><span>;
</span><span>  9</span> 
<span> 10</span> <span>use Yii;
</span><span> 11</span> 
<span> 12</span> <span>/*</span><span>*
</span><span> 13</span> <span> * Application is the base class for all application classes.
</span><span> 14</span> <span> * 是所有应用程序类的基类
</span><span> 15</span> <span> * @property \yii\web\AssetManager $assetManager The asset manager application component. This property is
</span><span> 16</span> <span> * read-only.资产管理器应用组件,只读
</span><span> 17</span> <span> * @property \yii\rbac\ManagerInterface $authManager The auth manager application component. Null is returned
</span><span> 18</span> <span> * if auth manager is not configured. This property is read-only.认证管理器应用程序组件。未配置返回null,只读
</span><span> 19</span> <span> * @property string $basePath The root directory of the application. 应用程序的根目录。
</span><span> 20</span> <span> * @property \yii\caching\Cache $cache The cache application component. Null if the component is not enabled.
</span><span> 21</span> <span> * This property is read-only.缓存应用程序组件。
</span><span> 22</span> <span> * @property \yii\db\Connection $db The database connection. This property is read-only.数据库连接。
</span><span> 23</span> <span> * @property \yii\web\ErrorHandler|\yii\console\ErrorHandler $errorHandler The error handler application
</span><span> 24</span> <span> * component. This property is read-only.错误处理程序应用程序组件
</span><span> 25</span> <span> * @property \yii\i18n\Formatter $formatter The formatter application component. This property is read-only.
</span><span> 26</span> <span> * 格式化程序的应用程序组件。
</span><span> 27</span> <span> * @property \yii\i18n\I18N $i18n The internationalization application component. This property is read-only.
</span><span> 28</span> <span> * 国际化应用组件。
</span><span> 29</span> <span> * @property \yii\log\Dispatcher $log The log dispatcher application component. This property is read-only.
</span><span> 30</span> <span> * 日志调度程序组件。
</span><span> 31</span> <span> * @property \yii\mail\MailerInterface $mailer The mailer application component. This property is read-only.
</span><span> 32</span> <span> * 邮件应用程序组件。
</span><span> 33</span> <span> * @property \yii\web\Request|\yii\console\Request $request The request component. This property is read-only.
</span><span> 34</span> <span> * 请求组件。
</span><span> 35</span> <span> * @property \yii\web\Response|\yii\console\Response $response The response component. This property is
</span><span> 36</span> <span> * read-only.反应元件。
</span><span> 37</span> <span> * @property string $runtimePath The directory that stores runtime files. Defaults to the "runtime"
</span><span> 38</span> <span> * subdirectory under [[basePath]].存储运行时文件的目录。
</span><span> 39</span> <span> * @property \yii\base\Security $security The security application component. This property is read-only.
</span><span> 40</span> <span> * 安全应用组件。
</span><span> 41</span> <span> * @property string $timeZone The time zone used by this application.该应用程序使用的时区。
</span><span> 42</span> <span> * @property string $uniqueId The unique ID of the module. This property is read-only.模块的唯一标识。
</span><span> 43</span> <span> * @property \yii\web\UrlManager $urlManager The URL manager for this application. This property is read-only.
</span><span> 44</span> <span> * 此应用程序的网址管理器。
</span><span> 45</span> <span> * @property string $vendorPath The directory that stores vendor files. Defaults to "vendor" directory under
</span><span> 46</span> <span> * [[basePath]].存储供应商文件的目录。
</span><span> 47</span> <span> * @property View|\yii\web\View $view The view application component that is used to render various view
</span><span> 48</span> <span> * files. This property is read-only.用于呈现各种视图文件的视图应用程序组件
</span><span> 49</span> <span> *
</span><span> 50</span> <span> * @author Qiang Xue <qiang.xue@gmail.com>
</span><span> 51</span> <span> * @since 2.0
</span><span> 52</span>  <span>*/</span>
<span> 53</span> <span>abstract</span> <span>class</span><span> Application extends Module
</span><span> 54</span> <span>{
</span><span> 55</span>     <span>/*</span><span>*
</span><span> 56</span> <span>     * @event Event an event raised before the application starts to handle a request.
</span><span> 57</span> <span>     * 在应用程序开始处理请求之前提出的事件。
</span><span> 58</span>      <span>*/</span>
<span> 59</span>     <span>const</span> EVENT_BEFORE_REQUEST = <span>'</span><span>beforeRequest</span><span>'</span><span>;
</span><span> 60</span>     <span>/*</span><span>*
</span><span> 61</span> <span>     * @event Event an event raised after the application successfully handles a request (before the response is sent out).
</span><span> 62</span> <span>     * 该应用程序成功处理请求后提出的事件
</span><span> 63</span>      <span>*/</span>
<span> 64</span>     <span>const</span> EVENT_AFTER_REQUEST = <span>'</span><span>afterRequest</span><span>'</span><span>;
</span><span> 65</span>     <span>/*</span><span>*
</span><span> 66</span> <span>     * Application state used by [[state]]: application just started.
</span><span> 67</span> <span>     * [[state]]适用状态:刚开始应用
</span><span> 68</span>      <span>*/</span>
<span> 69</span>     <span>const</span> STATE_BEGIN = <span>0</span><span>;
</span><span> 70</span>     <span>/*</span><span>*
</span><span> 71</span> <span>     * Application state used by [[state]]: application is initializing.
</span><span> 72</span> <span>     *  [[state]]应用程序状态:应用程序初始化。
</span><span> 73</span>      <span>*/</span>
<span> 74</span>     <span>const</span> STATE_INIT = <span>1</span><span>;
</span><span> 75</span>     <span>/*</span><span>*
</span><span> 76</span> <span>     * Application state used by [[state]]: application is triggering [[EVENT_BEFORE_REQUEST]].
</span><span> 77</span> <span>     *  [[state]]应用程序状态:应用触发[[EVENT_BEFORE_REQUEST]]
</span><span> 78</span>      <span>*/</span>
<span> 79</span>     <span>const</span> STATE_BEFORE_REQUEST = <span>2</span><span>;
</span><span> 80</span>     <span>/*</span><span>*
</span><span> 81</span> <span>     * Application state used by [[state]]: application is handling the request.
</span><span> 82</span> <span>     *  [[state]]应用程序状态:应用程序处理请求。
</span><span> 83</span>      <span>*/</span>
<span> 84</span>     <span>const</span> STATE_HANDLING_REQUEST = <span>3</span><span>;
</span><span> 85</span>     <span>/*</span><span>*
</span><span> 86</span> <span>     * Application state used by [[state]]: application is triggering [[EVENT_AFTER_REQUEST]]..
</span><span> 87</span> <span>     *  [[state]]应用程序状态:应用触发[[EVENT_AFTER_REQUEST]]
</span><span> 88</span>      <span>*/</span>
<span> 89</span>     <span>const</span> STATE_AFTER_REQUEST = <span>4</span><span>;
</span><span> 90</span>     <span>/*</span><span>*
</span><span> 91</span> <span>     * Application state used by [[state]]: application is about to send response.
</span><span> 92</span> <span>     *  [[state]]应用程序状态:应用程序即将发送响应。
</span><span> 93</span>      <span>*/</span>
<span> 94</span>     <span>const</span> STATE_SENDING_RESPONSE = <span>5</span><span>;
</span><span> 95</span>     <span>/*</span><span>*
</span><span> 96</span> <span>     * Application state used by [[state]]: application has ended.
</span><span> 97</span> <span>     *  [[state]]应用程序状态:应用程序结束。
</span><span> 98</span>      <span>*/</span>
<span> 99</span>     <span>const</span> STATE_END = <span>6</span><span>;
</span><span>100</span> 
<span>101</span>     <span>/*</span><span>*
</span><span>102</span> <span>     * @var string the namespace that controller classes are located in.控制器类的命名空间位置。
</span><span>103</span> <span>     * This namespace will be used to load controller classes by prepending it to the controller class name.
</span><span>104</span> <span>     * The default namespace is `app\controllers`.
</span><span>105</span> <span>     * 此命名空间将用于负载控制器类重写它的控制器类的名字。 默认命名空间是`app\controllers`。
</span><span>106</span> <span>     * Please refer to the [guide about class autoloading](guide:concept-autoloading.md) for more details.
</span><span>107</span>      <span>*/</span>
<span>108</span>     <span>public</span> $controllerNamespace = <span>'</span><span>app\\controllers</span><span>'</span><span>;
</span><span>109</span>     <span>/*</span><span>*
</span><span>110</span> <span>     * @var string the application name.应用程序名称。
</span><span>111</span>      <span>*/</span>
<span>112</span>     <span>public</span> $name = <span>'</span><span>My Application</span><span>'</span><span>;
</span><span>113</span>     <span>/*</span><span>*
</span><span>114</span> <span>     * @var string the version of this application.此应用程序的版本。
</span><span>115</span>      <span>*/</span>
<span>116</span>     <span>public</span> $version = <span>'</span><span>1.0</span><span>'</span><span>;
</span><span>117</span>     <span>/*</span><span>*
</span><span>118</span> <span>     * @var string the charset currently used for the application.目前使用的字符集。
</span><span>119</span>      <span>*/</span>
<span>120</span>     <span>public</span> $charset = <span>'</span><span>UTF-8</span><span>'</span><span>;
</span><span>121</span>     <span>/*</span><span>*
</span><span>122</span> <span>     * @var string the language that is meant to be used for end users. It is recommended that you
</span><span>123</span> <span>     * use [IETF language tags](</span><span>http://en.wikipedia.org/wiki/IETF_language_tag</span><span>). For example, `en` stands
</span><span>124</span> <span>     * for English, while `en-US` stands for English (United States).
</span><span>125</span> <span>     * 用来作为终端用户使用的语言
</span><span>126</span> <span>     * @see sourceLanguage
</span><span>127</span>      <span>*/</span>
<span>128</span>     <span>public</span> $language = <span>'</span><span>en-US</span><span>'</span><span>;
</span><span>129</span>     <span>/*</span><span>*
</span><span>130</span> <span>     * @var string the language that the application is written in. This mainly refers to
</span><span>131</span> <span>     * the language that the messages and view files are written in.
</span><span>132</span> <span>     * 应用程序编写的语言。
</span><span>133</span> <span>     * @see language
</span><span>134</span>      <span>*/</span>
<span>135</span>     <span>public</span> $sourceLanguage = <span>'</span><span>en-US</span><span>'</span><span>;
</span><span>136</span>     <span>/*</span><span>*
</span><span>137</span> <span>     * @var Controller the currently active controller instance当前活动控制器实例
</span><span>138</span>      <span>*/</span>
<span>139</span>     <span>public</span><span> $controller;
</span><span>140</span>     <span>/*</span><span>*
</span><span>141</span> <span>     * @var string|boolean the layout that should be applied for views in this application. Defaults to 'main'.
</span><span>142</span> <span>     * If this is false, layout will be disabled.
</span><span>143</span> <span>     * 该应用程序中应用的布局。
</span><span>144</span>      <span>*/</span>
<span>145</span>     <span>public</span> $layout = <span>'</span><span>main</span><span>'</span><span>;
</span><span>146</span>     <span>/*</span><span>*
</span><span>147</span> <span>     * @var string the requested route请求的路径    请求的路径
</span><span>148</span>      <span>*/</span>
<span>149</span>     <span>public</span><span> $requestedRoute;
</span><span>150</span>     <span>/*</span><span>*
</span><span>151</span> <span>     * @var Action the requested Action. If null, it means the request cannot be resolved into an action.
</span><span>152</span> <span>     * 操作所要求的行动
</span><span>153</span>      <span>*/</span>
<span>154</span>     <span>public</span><span> $requestedAction;
</span><span>155</span>     <span>/*</span><span>*
</span><span>156</span> <span>     * @var array the parameters supplied to the requested action.
</span><span>157</span> <span>     * 所请求的动作提供的参数。
</span><span>158</span>      <span>*/</span>
<span>159</span>     <span>public</span><span> $requestedParams;
</span><span>160</span>     <span>/*</span><span>*
</span><span>161</span> <span>     * @var array list of installed Yii extensions. Each array element represents a single extension
</span><span>162</span> <span>     * with the following structure:
</span><span>163</span> <span>     * 安装Yii扩展名列表。每个数组元素代表一个扩展
</span><span>164</span> <span>     *
</span><span>165</span> <span>     * ~~~
</span><span>166</span> <span>     * [
</span><span>167</span> <span>     *     'name' => 'extension name',
</span><span>168</span> <span>     *     'version' => 'version number',
</span><span>169</span> <span>     *     'bootstrap' => 'BootstrapClassName',  // optional, may also be a configuration array
</span><span>170</span> <span>     *     'alias' => [
</span><span>171</span> <span>     *         '@alias1' => 'to/path1',
</span><span>172</span> <span>     *         '@alias2' => 'to/path2',
</span><span>173</span> <span>     *     ],
</span><span>174</span> <span>     * ]
</span><span>175</span> <span>     * ~~~
</span><span>176</span> <span>     *
</span><span>177</span> <span>     * The "bootstrap" class listed above will be instantiated during the application
</span><span>178</span> <span>     * [[bootstrap()|bootstrapping process]]. If the class implements [[BootstrapInterface]],
</span><span>179</span> <span>     * its [[BootstrapInterface::bootstrap()|bootstrap()]] method will be also be called.
</span><span>180</span> <span>     *
</span><span>181</span> <span>     * If not set explicitly in the application config, this property will be populated with the contents of
</span><span>182</span> <span>     * 如果在应用程序配置中没有设置,该属性将填充到内容
</span><span>183</span> <span>     * @vendor/yiisoft/extensions.php`.
</span><span>184</span>      <span>*/</span>
<span>185</span>     <span>public</span><span> $extensions;
</span><span>186</span>     <span>/*</span><span>*
</span><span>187</span> <span>     * @var array list of components that should be run during the application [[bootstrap()|bootstrapping process]].
</span><span>188</span> <span>     * 组件的列表,运行在 [[bootstrap()|bootstrapping process]]中的应用
</span><span>189</span> <span>     * Each component may be specified in one of the following formats:
</span><span>190</span> <span>     *
</span><span>191</span> <span>     * - an application component ID as specified via [[components]].
</span><span>192</span> <span>     * - a module ID as specified via [[modules]].
</span><span>193</span> <span>     * - a class name.
</span><span>194</span> <span>     * - a configuration array.
</span><span>195</span> <span>     *
</span><span>196</span> <span>     * During the bootstrapping process, each component will be instantiated. If the component class
</span><span>197</span> <span>     * implements [[BootstrapInterface]], its [[BootstrapInterface::bootstrap()|bootstrap()]] method
</span><span>198</span> <span>     * will be also be called.
</span><span>199</span> <span>     * 在整个启动过程中,每个组件被实例化。如果组件类提到 [[BootstrapInterface]], 
</span><span>200</span> <span>     * [[BootstrapInterface::bootstrap()|bootstrap()]]方法也会调用
</span><span>201</span>      <span>*/</span>
<span>202</span>     <span>public</span> $bootstrap =<span> [];
</span><span>203</span>     <span>/*</span><span>*
</span><span>204</span> <span>     * @var integer the current application state during a request handling life cycle.
</span><span>205</span> <span>     * This property is managed by the application. Do not modify this property.    
</span><span>206</span> <span>     * 在请求处理生命周期中的当前应用程序状态。属性由应用程序管理。不要修改此属性。
</span><span>207</span>      <span>*/</span>
<span>208</span>     <span>public</span><span> $state;
</span><span>209</span>     <span>/*</span><span>*
</span><span>210</span> <span>     * @var array list of loaded modules indexed by their class names.
</span><span>211</span> <span>     * 加载模块列表由它们的类名称索引组成。
</span><span>212</span>      <span>*/</span>
<span>213</span>     <span>public</span> $loadedModules =<span> [];
</span><span>214</span> 
<span>215</span> 
<span>216</span>     <span>/*</span><span>*
</span><span>217</span> <span>     * Constructor.构造函数
</span><span>218</span> <span>     * @param array $config name-value pairs that will be used to initialize the object properties.
</span><span>219</span> <span>     * Note that the configuration must contain both [[id]] and [[basePath]].
</span><span>220</span> <span>     * 用来初始化对象属性的 name-value 注意配置必须包含[[id]] 和[[basePath]].
</span><span>221</span> <span>     * @throws InvalidConfigException if either [[id]] or [[basePath]] configuration is missing.
</span><span>222</span> <span>     * 如果是修改[[id]] 或[[basePath]] 则配置丢失。
</span><span>223</span>      <span>*/</span>
<span>224</span>     <span>public</span> function __construct($config =<span> [])
</span><span>225</span> <span>    {
</span><span>226</span>         Yii::$app = $<span>this</span>;<span>//</span><span> 将自身的实例绑到Yii的$app上</span>
<span>227</span>         $<span>this</span>->setInstance($<span>this</span>);<span>//</span><span> 将自身加入到loadedModules中</span>
<span>228</span> 
<span>229</span>         $<span>this</span>->state = self::STATE_BEGIN;<span>//</span><span> 设置状态为刚开始
</span><span>230</span> 
<span>231</span>         <span>//</span><span> 做预处理配置</span>
<span>232</span>         $<span>this</span>-><span>preInit($config);
</span><span>233</span> 
<span>234</span>         $<span>this</span>-><span>registerErrorHandler($config);
</span><span>235</span> 
<span>236</span> <span>        Component::__construct($config);
</span><span>237</span> <span>    }
</span><span>238</span> 
<span>239</span>     <span>/*</span><span>*
</span><span>240</span> <span>     * Pre-initializes the application. 初始化应用。
</span><span>241</span> <span>     * This method is called at the beginning of the application constructor.
</span><span>242</span> <span>     * It initializes several important application properties.
</span><span>243</span> <span>     * 在构造函数中调用该方法,用于初始化一些重要的属性
</span><span>244</span> <span>     * If you override this method, please make sure you call the parent implementation.
</span><span>245</span> <span>     * @param array $config the application configuration   应用的配置
</span><span>246</span> <span>     * @throws InvalidConfigException if either [[id]] or [[basePath]] configuration is missing.
</span><span>247</span>      <span>*/</span>
<span>248</span>     <span>public</span> function preInit(&<span>$config)
</span><span>249</span> <span>    {
</span><span>250</span>          <span>//</span><span> 使用了&符号,表示$config的修改会保留</span>
<span>251</span>         <span>if</span> (!isset($config[<span>'</span><span>id</span><span>'</span>])) {<span>//</span><span>判断配置中是否有application ID ,如果没有,抛出异常</span>
<span>252</span>             <span>throw</span> <span>new</span> InvalidConfigException(<span>'</span><span>The "id" configuration for the Application is required.</span><span>'</span><span>);
</span><span>253</span> <span>        }
</span><span>254</span>         <span>if</span> (isset($config[<span>'</span><span>basePath</span><span>'</span><span>])) {
</span><span>255</span>             <span>//</span><span> 是否配置项目的root路径</span>
<span>256</span>             $<span>this</span>->setBasePath($config[<span>'</span><span>basePath</span><span>'</span><span>]);
</span><span>257</span>              <span>//</span><span>赋值给模块的_basepath属性,并在设置后删除</span>
<span>258</span>             unset($config[<span>'</span><span>basePath</span><span>'</span><span>]);
</span><span>259</span>         } <span>else</span> {<span>//</span><span>否则抛出异常</span>
<span>260</span>             <span>throw</span> <span>new</span> InvalidConfigException(<span>'</span><span>The "basePath" configuration for the Application is required.</span><span>'</span><span>);
</span><span>261</span> <span>        }
</span><span>262</span>         <span>//</span><span>如果配置文件中设置了 vendorPath 使用配置的值,并在设置后删除,否则使用默认的</span>
<span>263</span>         <span>if</span> (isset($config[<span>'</span><span>vendorPath</span><span>'</span><span>])) {
</span><span>264</span>             $<span>this</span>->setVendorPath($config[<span>'</span><span>vendorPath</span><span>'</span><span>]);
</span><span>265</span>             unset($config[<span>'</span><span>vendorPath</span><span>'</span><span>]);
</span><span>266</span>         } <span>else</span><span> {
</span><span>267</span>             <span>//</span><span> set "@vendor"</span>
<span>268</span>             $<span>this</span>-><span>getVendorPath();
</span><span>269</span> <span>        }
</span><span>270</span>         <span>//</span><span>如果配置文件中设置了 runtimePath 使用配置的值,并在设置后删除,否则使用默认的</span>
<span>271</span>         <span>if</span> (isset($config[<span>'</span><span>runtimePath</span><span>'</span><span>])) {
</span><span>272</span>             $<span>this</span>->setRuntimePath($config[<span>'</span><span>runtimePath</span><span>'</span><span>]);
</span><span>273</span>             unset($config[<span>'</span><span>runtimePath</span><span>'</span><span>]);
</span><span>274</span>         } <span>else</span><span> {
</span><span>275</span>             <span>//</span><span> set "@runtime"</span>
<span>276</span>             $<span>this</span>-><span>getRuntimePath();
</span><span>277</span> <span>        }
</span><span>278</span>          <span>//</span><span>如果配置文件中设置了 timeZone 使用配置的值,并在设置后删除,否则使用默认的时区</span>
<span>279</span>         <span>if</span> (isset($config[<span>'</span><span>timeZone</span><span>'</span><span>])) {
</span><span>280</span>             $<span>this</span>->setTimeZone($config[<span>'</span><span>timeZone</span><span>'</span><span>]);
</span><span>281</span>             unset($config[<span>'</span><span>timeZone</span><span>'</span><span>]);
</span><span>282</span>         } elseif (!ini_get(<span>'</span><span>date.timezone</span><span>'</span><span>)) {
</span><span>283</span>             $<span>this</span>->setTimeZone(<span>'</span><span>UTC</span><span>'</span><span>);
</span><span>284</span> <span>        }
</span><span>285</span> 
<span>286</span>         <span>//</span><span> merge core components with custom components</span>
<span>287</span>         <span>foreach</span> ($<span>this</span>->coreComponents() <span>as</span> $id =><span> $component) {
</span><span>288</span>             <span>if</span> (!isset($config[<span>'</span><span>components</span><span>'</span><span>][$id])) {
</span><span>289</span>                 <span>//</span><span> 如果配置中没有配置相应的核心component,就赋给它</span>
<span>290</span>                 $config[<span>'</span><span>components</span><span>'</span>][$id] =<span> $component;
</span><span>291</span>             } elseif (is_array($config[<span>'</span><span>components</span><span>'</span>][$id]) && !isset($config[<span>'</span><span>components</span><span>'</span>][$id][<span>'</span><span>class</span><span>'</span><span>])) {
</span><span>292</span>                  <span>//</span><span> 如果存在相应的核心component,但没有定义它的class,就直接赋到class的key上</span>
<span>293</span>                 $config[<span>'</span><span>components</span><span>'</span>][$id][<span>'</span><span>class</span><span>'</span>] = $component[<span>'</span><span>class</span><span>'</span><span>];
</span><span>294</span> <span>            }
</span><span>295</span> <span>        }
</span><span>296</span> <span>    }
</span><span>297</span> 
<span>298</span>     <span>/*</span><span>*
</span><span>299</span> <span>     * @inheritdoc
</span><span>300</span>      <span>*/</span>
<span>301</span>     <span>public</span><span> function init()
</span><span>302</span> <span>    {
</span><span>303</span>         $<span>this</span>->state =<span> self::STATE_INIT;
</span><span>304</span>         $<span>this</span>-><span>bootstrap();
</span><span>305</span> <span>    }
</span><span>306</span> 
<span>307</span>     <span>/*</span><span>*
</span><span>308</span> <span>     * Initializes extensions and executes bootstrap components.初始化扩展并执行初始化程序组件
</span><span>309</span> <span>     * This method is called by [[init()]] after the application has been fully configured.
</span><span>310</span> <span>     * 该方法在应用完全配置后被[[init()]]调用
</span><span>311</span> <span>     * If you override this method, make sure you also call the parent implementation.
</span><span>312</span>      <span>*/</span>
<span>313</span>     <span>protected</span><span> function bootstrap()
</span><span>314</span> <span>    {
</span><span>315</span>         <span>if</span> ($<span>this</span>->extensions === <span>null</span>) {<span>//</span><span>如果没有配置,则调用Yii的默认扩展组件</span>
<span>316</span>             $file = Yii::getAlias(<span>'</span><span>@vendor/yiisoft/extensions.php</span><span>'</span><span>);
</span><span>317</span>             $<span>this</span>->extensions = is_file($file) ?<span> include($file) : [];
</span><span>318</span> <span>        }
</span><span>319</span>         <span>foreach</span> ($<span>this</span>->extensions <span>as</span><span> $extension) {
</span><span>320</span>             <span>if</span> (!empty($extension[<span>'</span><span>alias</span><span>'</span>])) {<span>//</span><span>如果扩展组件有设置别名</span>
<span>321</span>                 <span>foreach</span> ($extension[<span>'</span><span>alias</span><span>'</span>] <span>as</span> $name =><span> $path) {
</span><span>322</span>                     Yii::setAlias($name, $path);<span>//</span><span>将给扩展的别名注册到别名数组中</span>
<span>323</span> <span>                }
</span><span>324</span> <span>            }
</span><span>325</span>             <span>if</span> (isset($extension[<span>'</span><span>bootstrap</span><span>'</span>])) {<span>//</span><span>如果扩展组件有[[bootstrap]]配置 则初始化给扩展组件</span>
<span>326</span>                 $component = Yii::createObject($extension[<span>'</span><span>bootstrap</span><span>'</span><span>]);
</span><span>327</span>                 <span>if</span><span> ($component instanceof BootstrapInterface) {
</span><span>328</span>                     Yii::trace(<span>"</span><span>Bootstrap with </span><span>"</span> . get_class($component) . <span>'</span><span>::bootstrap()</span><span>'</span><span>, __METHOD__);
</span><span>329</span>                     $component->bootstrap($<span>this</span><span>);
</span><span>330</span>                 } <span>else</span><span> {
</span><span>331</span>                     Yii::trace(<span>"</span><span>Bootstrap with </span><span>"</span><span> . get_class($component), __METHOD__);
</span><span>332</span> <span>                }
</span><span>333</span> <span>            }
</span><span>334</span> <span>        }
</span><span>335</span> 
<span>336</span>         <span>foreach</span> ($<span>this</span>->bootstrap <span>as</span> $<span>class</span><span>) {
</span><span>337</span>             $component = <span>null</span><span>;
</span><span>338</span>             <span>if</span> (is_string($<span>class</span><span>)) {
</span><span>339</span>                 <span>if</span> ($<span>this</span>->has($<span>class</span><span>)) {
</span><span>340</span>                     $component = $<span>this</span>-><span>get</span>($<span>class</span><span>);
</span><span>341</span>                 } elseif ($<span>this</span>->hasModule($<span>class</span><span>)) {
</span><span>342</span>                     $component = $<span>this</span>->getModule($<span>class</span><span>);
</span><span>343</span>                 } elseif (strpos($<span>class</span>, <span>'</span><span>\\</span><span>'</span>) === <span>false</span><span>) {
</span><span>344</span>                     <span>throw</span> <span>new</span> InvalidConfigException(<span>"</span><span>Unknown bootstrapping component ID: $class</span><span>"</span><span>);
</span><span>345</span> <span>                }
</span><span>346</span> <span>            }
</span><span>347</span>             <span>if</span> (!isset($component)) {<span>//</span><span>如果不存在,则调用Yii创建对象</span>
<span>348</span>                 $component = Yii::createObject($<span>class</span><span>);
</span><span>349</span> <span>            }
</span><span>350</span> 
<span>351</span>             <span>if</span><span> ($component instanceof BootstrapInterface) {
</span><span>352</span>                 Yii::trace(<span>"</span><span>Bootstrap with </span><span>"</span> . get_class($component) . <span>'</span><span>::bootstrap()</span><span>'</span><span>, __METHOD__);
</span><span>353</span>                 $component->bootstrap($<span>this</span><span>);
</span><span>354</span>             } <span>else</span><span> {
</span><span>355</span>                 Yii::trace(<span>"</span><span>Bootstrap with </span><span>"</span><span> . get_class($component), __METHOD__);
</span><span>356</span> <span>            }
</span><span>357</span> <span>        }
</span><span>358</span>     }

未完待续。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn