


yii2 source code study notes (9), yii2 source code study notes_PHP tutorial
Jul 12, 2016 am 08:51 AMyii2源碼學(xué)習(xí)筆記(九),yii2源碼學(xué)習(xí)筆記
Application是所有應(yīng)用程序類(lèi)的基類(lèi),接下來(lái)了解一下它的源碼。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> * 是所有應(yīng)用程序類(lèi)的基類(lèi) </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.資產(chǎn)管理器應(yīng)用組件,只讀 </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.認(rèn)證管理器應(yīng)用程序組件。未配置返回null,只讀 </span><span> 19</span> <span> * @property string $basePath The root directory of the application. 應(yīng)用程序的根目錄。 </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.緩存應(yīng)用程序組件。 </span><span> 22</span> <span> * @property \yii\db\Connection $db The database connection. This property is read-only.數(shù)據(jù)庫(kù)連接。 </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.錯(cuò)誤處理程序應(yīng)用程序組件 </span><span> 25</span> <span> * @property \yii\i18n\Formatter $formatter The formatter application component. This property is read-only. </span><span> 26</span> <span> * 格式化程序的應(yīng)用程序組件。 </span><span> 27</span> <span> * @property \yii\i18n\I18N $i18n The internationalization application component. This property is read-only. </span><span> 28</span> <span> * 國(guó)際化應(yīng)用組件。 </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> * 日志調(diào)度程序組件。 </span><span> 31</span> <span> * @property \yii\mail\MailerInterface $mailer The mailer application component. This property is read-only. </span><span> 32</span> <span> * 郵件應(yīng)用程序組件。 </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> * 請(qǐng)求組件。 </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.反應(yīng)元件。 </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]].存儲(chǔ)運(yùn)行時(shí)文件的目錄。 </span><span> 39</span> <span> * @property \yii\base\Security $security The security application component. This property is read-only. </span><span> 40</span> <span> * 安全應(yīng)用組件。 </span><span> 41</span> <span> * @property string $timeZone The time zone used by this application.該應(yīng)用程序使用的時(shí)區(qū)。 </span><span> 42</span> <span> * @property string $uniqueId The unique ID of the module. This property is read-only.模塊的唯一標(biāo)識(shí)。 </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> * 此應(yīng)用程序的網(wǎng)址管理器。 </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]].存儲(chǔ)供應(yīng)商文件的目錄。 </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.用于呈現(xiàn)各種視圖文件的視圖應(yīng)用程序組件 </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> * 在應(yīng)用程序開(kāi)始處理請(qǐng)求之前提出的事件。 </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> * 該應(yīng)用程序成功處理請(qǐng)求后提出的事件 </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]]適用狀態(tài):剛開(kāi)始應(yīng)用 </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]]應(yīng)用程序狀態(tài):應(yīng)用程序初始化。 </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]]應(yīng)用程序狀態(tài):應(yīng)用觸發(fā)[[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]]應(yīng)用程序狀態(tài):應(yīng)用程序處理請(qǐng)求。 </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]]應(yīng)用程序狀態(tài):應(yīng)用觸發(fā)[[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]]應(yīng)用程序狀態(tài):應(yīng)用程序即將發(fā)送響應(yīng)。 </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]]應(yīng)用程序狀態(tài):應(yīng)用程序結(jié)束。 </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.控制器類(lèi)的命名空間位置。 </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> * 此命名空間將用于負(fù)載控制器類(lèi)重寫(xiě)它的控制器類(lèi)的名字。 默認(rèn)命名空間是`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.應(yīng)用程序名稱(chēng)。 </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.此應(yīng)用程序的版本。 </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> * 用來(lái)作為終端用戶(hù)使用的語(yǔ)言 </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> * 應(yīng)用程序編寫(xiě)的語(yǔ)言。 </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當(dāng)前活動(dòng)控制器實(shí)例 </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> * 該應(yīng)用程序中應(yīng)用的布局。 </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請(qǐng)求的路徑 請(qǐng)求的路徑 </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> * 操作所要求的行動(dòng) </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> * 所請(qǐng)求的動(dòng)作提供的參數(shù)。 </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擴(kuò)展名列表。每個(gè)數(shù)組元素代表一個(gè)擴(kuò)展 </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> * 如果在應(yīng)用程序配置中沒(méi)有設(shè)置,該屬性將填充到內(nèi)容 </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> * 組件的列表,運(yùn)行在 [[bootstrap()|bootstrapping process]]中的應(yīng)用 </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> * 在整個(gè)啟動(dòng)過(guò)程中,每個(gè)組件被實(shí)例化。如果組件類(lèi)提到 [[BootstrapInterface]], </span><span>200</span> <span> * [[BootstrapInterface::bootstrap()|bootstrap()]]方法也會(huì)調(diào)用 </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> * 在請(qǐng)求處理生命周期中的當(dāng)前應(yīng)用程序狀態(tài)。屬性由應(yīng)用程序管理。不要修改此屬性。 </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> * 加載模塊列表由它們的類(lèi)名稱(chēng)索引組成。 </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.構(gòu)造函數(shù) </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> * 用來(lái)初始化對(duì)象屬性的 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> 將自身的實(shí)例綁到Y(jié)ii的$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> 設(shè)置狀態(tài)為剛開(kāi)始 </span><span>230</span> <span>231</span> <span>//</span><span> 做預(yù)處理配置</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. 初始化應(yīng)用。 </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> * 在構(gòu)造函數(shù)中調(diào)用該方法,用于初始化一些重要的屬性 </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 應(yīng)用的配置 </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> 使用了&符號(hào),表示$config的修改會(huì)保留</span> <span>251</span> <span>if</span> (!isset($config[<span>'</span><span>id</span><span>'</span>])) {<span>//</span><span>判斷配置中是否有application ID ,如果沒(méi)有,拋出異常</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> 是否配置項(xiàng)目的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屬性,并在設(shè)置后刪除</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>如果配置文件中設(shè)置了 vendorPath 使用配置的值,并在設(shè)置后刪除,否則使用默認(rèn)的</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>如果配置文件中設(shè)置了 runtimePath 使用配置的值,并在設(shè)置后刪除,否則使用默認(rèn)的</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>如果配置文件中設(shè)置了 timeZone 使用配置的值,并在設(shè)置后刪除,否則使用默認(rèn)的時(shí)區(qū)</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> 如果配置中沒(méi)有配置相應(yīng)的核心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> 如果存在相應(yīng)的核心component,但沒(méi)有定義它的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.初始化擴(kuò)展并執(zhí)行初始化程序組件 </span><span>309</span> <span> * This method is called by [[init()]] after the application has been fully configured. </span><span>310</span> <span> * 該方法在應(yīng)用完全配置后被[[init()]]調(diào)用 </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>如果沒(méi)有配置,則調(diào)用Yii的默認(rèn)擴(kuò)展組件</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>如果擴(kuò)展組件有設(shè)置別名</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>將給擴(kuò)展的別名注冊(cè)到別名數(shù)組中</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>如果擴(kuò)展組件有[[bootstrap]]配置 則初始化給擴(kuò)展組件</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>如果不存在,則調(diào)用Yii創(chuàng)建對(duì)象</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> }
未完待續(xù)。

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

In the current information age, big data, artificial intelligence, cloud computing and other technologies have become the focus of major enterprises. Among these technologies, graphics card rendering technology, as a high-performance graphics processing technology, has received more and more attention. Graphics card rendering technology is widely used in game development, film and television special effects, engineering modeling and other fields. For developers, choosing a framework that suits their projects is a very important decision. Among current languages, PHP is a very dynamic language. Some excellent PHP frameworks such as Yii2, Ph

The Yii framework is an open source PHP Web application framework that provides numerous tools and components to simplify the process of Web application development, of which data query is one of the important components. In the Yii framework, we can use SQL-like syntax to access the database to query and manipulate data efficiently. The query builder of the Yii framework mainly includes the following types: ActiveRecord query, QueryBuilder query, command query and original SQL query

As the Internet continues to develop, the demand for web application development is also getting higher and higher. For developers, developing applications requires a stable, efficient, and powerful framework, which can improve development efficiency. Yii is a leading high-performance PHP framework that provides rich features and good performance. Yii3 is the next generation version of the Yii framework, which further optimizes performance and code quality based on Yii2. In this article, we will introduce how to use Yii3 framework to develop PHP applications.

As the demand for web applications continues to grow, developers have more and more choices in choosing development frameworks. Symfony and Yii2 are two popular PHP frameworks. They both have powerful functions and performance, but when faced with the need to develop large-scale web applications, which framework is more suitable? Next we will conduct a comparative analysis of Symphony and Yii2 to help you make a better choice. Basic Overview Symphony is an open source web application framework written in PHP and is built on

With the continuous development of cloud computing technology, data backup has become something that every enterprise must do. In this context, it is particularly important to develop a highly available cloud backup system. The PHP framework Yii is a powerful framework that can help developers quickly build high-performance web applications. The following will introduce how to use the Yii framework to develop a highly available cloud backup system. Designing the database model In the Yii framework, the database model is a very important part. Because the data backup system requires a lot of tables and relationships

The steps to containerize and deploy Yii applications using Docker include: 1. Create a Dockerfile and define the image building process; 2. Use DockerCompose to launch Yii applications and MySQL database; 3. Optimize image size and performance. This involves not only specific technical operations, but also understanding the working principles and best practices of Dockerfile to ensure efficient and reliable deployment.

The main differences between Laravel and Yii are design concepts, functional characteristics and usage scenarios. 1.Laravel focuses on the simplicity and pleasure of development, and provides rich functions such as EloquentORM and Artisan tools, suitable for rapid development and beginners. 2.Yii emphasizes performance and efficiency, is suitable for high-load applications, and provides efficient ActiveRecord and cache systems, but has a steep learning curve.

With the rapid development of the Internet, APIs have become an important way to exchange data between various applications. Therefore, it has become increasingly important to develop an API framework that is easy to maintain, efficient, and stable. When choosing an API framework, Yii2 and Symfony are two popular choices among developers. So, which one is more suitable for API development? This article will compare these two frameworks and give some conclusions. 1. Basic introduction Yii2 and Symfony are mature PHP frameworks with corresponding extensions that can be used to develop
