yii2源码学习笔记(二十),yii2源码学习笔记
yii2源码学习笔记(二十),yii2源码学习笔记
Widget类是所有部件的基类。yii2\base\Widget.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>use ReflectionClass; </span><span> 12</span> <span> 13</span> <span>/*</span><span>* </span><span> 14</span> <span> * Widget is the base class for widgets. </span><span> 15</span> <span> * Widget是所有小部件的基类 </span><span> 16</span> <span> * @property string $id ID of the widget. 小部件标识 </span><span> 17</span> <span> * @property \yii\web\View $view The view object that can be used to render views or view files. Note that the </span><span> 18</span> <span> * type of this property differs in getter and setter. See [[getView()]] and [[setView()]] for details. </span><span> 19</span> <span> * 用于渲染视图或视图文件的视图对象 在getter 和 setter中是不同的 </span><span> 20</span> <span> * @property string $viewPath The directory containing the view files for this widget. This property is </span><span> 21</span> <span> * read-only. 包含此控件的视图文件目录 </span><span> 22</span> <span> * </span><span> 23</span> <span> * @author Qiang Xue <qiang.xue@gmail.com> </span><span> 24</span> <span> * @since 2.0 </span><span> 25</span> <span>*/</span> <span> 26</span> <span>class</span><span> Widget extends Component implements ViewContextInterface </span><span> 27</span> <span>{ </span><span> 28</span> <span>/*</span><span>* </span><span> 29</span> <span> * @var integer a counter used to generate [[id]] for widgets. </span><span> 30</span> <span> * @internal 用于生成widget ID的计数器 </span><span> 31</span> <span>*/</span> <span> 32</span> <span>public</span> <span>static</span> $counter = <span>0</span><span>; </span><span> 33</span> <span>/*</span><span>* </span><span> 34</span> <span> * @var string the prefix to the automatically generated widget IDs. </span><span> 35</span> <span> * @see getId() 自动生成的前缀 </span><span> 36</span> <span>*/</span> <span> 37</span> <span>public</span> <span>static</span> $autoIdPrefix = <span>'</span><span>w</span><span>'</span><span>; </span><span> 38</span> <span>/*</span><span>* </span><span> 39</span> <span> * @var Widget[] the widgets that are currently being rendered (not ended). This property </span><span> 40</span> <span> * is maintained by [[begin()]] and [[end()]] methods. 目前正在渲染的小部件 </span><span> 41</span> <span> * @internal </span><span> 42</span> <span>*/</span> <span> 43</span> <span>public</span> <span>static</span> $stack =<span> []; </span><span> 44</span> <span> 45</span> <span> 46</span> <span>/*</span><span>* </span><span> 47</span> <span> * Begins a widget. 开始一个部件 </span><span> 48</span> <span> * This method creates an instance of the calling class. It will apply the configuration </span><span> 49</span> <span> * to the created instance. A matching [[end()]] call should be called later. </span><span> 50</span> <span> * 将应用配置文件创建调用类的实例,与[end()]方法相对应 </span><span> 51</span> <span> * @param array $config name-value pairs that will be used to initialize the object properties </span><span> 52</span> <span> * 用于初始化属性的参数 </span><span> 53</span> <span> * @return static the newly created widget instance 静态新创建的部件实例 </span><span> 54</span> <span>*/</span> <span> 55</span> <span>public</span> <span>static</span> function begin($config =<span> []) </span><span> 56</span> <span> { </span><span> 57</span> $config[<span>'</span><span>class</span><span>'</span>] = get_called_class();<span>//</span><span>后期静态绑定类的名称</span> <span> 58</span> <span>/*</span><span> @var $widget Widget </span><span>*/</span> <span> 59</span> $widget = Yii::createObject($config);<span>//</span><span>通过类名和传入的配置,实例化调用类</span> <span> 60</span> <span>static</span>::$stack[] = $widget;<span>//</span><span>将对象放入正在渲染的部件堆栈中</span> <span> 61</span> <span> 62</span> <span>return</span><span> $widget; </span><span> 63</span> <span> } </span><span> 64</span> <span> 65</span> <span>/*</span><span>* </span><span> 66</span> <span> * Ends a widget. 结束小部件 </span><span> 67</span> <span> * Note that the rendering result of the widget is directly echoed out.渲染结果是直接呼应的 </span><span> 68</span> <span> * @return static the widget instance that is ended. 静态结束的部件实例。 </span><span> 69</span> <span> * @throws InvalidCallException if [[begin()]] and [[end()]] calls are not properly nested </span><span> 70</span> <span>*/</span> <span> 71</span> <span>public</span> <span>static</span><span> function end() </span><span> 72</span> <span> { </span><span> 73</span> <span>if</span> (!empty(<span>static</span>::$stack)) {<span>//</span><span>正在呈现的小部件堆栈中存在调用类实例</span> <span> 74</span> $widget = array_pop(<span>static</span>::$stack);<span>//</span><span>从堆栈中删除最后一个实例</span> <span> 75</span> <span>if</span> (get_class($widget) ===<span> get_called_class()) { </span><span> 76</span> echo $widget->run(); <span>//</span><span>如果删除的实例类名和当前调用类名相同,输出小部件的内容</span> <span> 77</span> <span>return</span><span> $widget; </span><span> 78</span> } <span>else</span><span> { </span><span> 79</span> <span>throw</span> <span>new</span> InvalidCallException(<span>"</span><span>Expecting end() of </span><span>"</span> . get_class($widget) . <span>"</span><span>, found </span><span>"</span><span> . get_called_class()); </span><span> 80</span> <span> } </span><span> 81</span> } <span>else</span><span> { </span><span> 82</span> <span>throw</span> <span>new</span> InvalidCallException(<span>"</span><span>Unexpected </span><span>"</span> . get_called_class() . <span>'</span><span>::end() call. A matching begin() is not found.</span><span>'</span><span>); </span><span> 83</span> <span> } </span><span> 84</span> <span> } </span><span> 85</span> <span> 86</span> <span>/*</span><span>* </span><span> 87</span> <span> * Creates a widget instance and runs it. 创建一个部件实例,并运行 </span><span> 88</span> <span> * The widget rendering result is returned by this method. 返回部件渲染的结果。 </span><span> 89</span> <span> * @param array $config name-value pairs that will be used to initialize the object properties </span><span> 90</span> <span> * 用于初始化对象属性的参数 </span><span> 91</span> <span> * @return string the rendering result of the widget. 控件的渲染结果。 </span><span> 92</span> <span>*/</span> <span> 93</span> <span>public</span> <span>static</span> function widget($config =<span> []) </span><span> 94</span> <span> { </span><span> 95</span> ob_start(); <span>//</span><span>打开输出缓冲区</span> <span> 96</span> ob_implicit_flush(<span>false</span>);<span>//</span><span>关闭绝对刷新</span> <span> 97</span> <span>/*</span><span> @var $widget Widget </span><span>*/</span> <span> 98</span> $config[<span>'</span><span>class</span><span>'</span>] = get_called_class(); <span>//</span><span>获取调用类的类名</span> <span> 99</span> $widget = Yii::createObject($config); <span>//</span><span>实例化类</span> <span>100</span> $<span>out</span> = $widget->run();<span>//</span><span>运行部件</span> <span>101</span> <span>102</span> <span>return</span> ob_get_clean() . $<span>out</span>; <span>//</span><span>返回内部缓冲区的内容,关闭缓冲区</span> <span>103</span> <span> } </span><span>104</span> <span>105</span> <span>private</span><span> $_id; </span><span>106</span> <span>107</span> <span>/*</span><span>* </span><span>108</span> <span> * Returns the ID of the widget. 返回插件的标识 </span><span>109</span> <span> * @param boolean $autoGenerate whether to generate an ID if it is not set previously </span><span>110</span> <span> * 是否生成一个唯一标识,如果没有设置 </span><span>111</span> <span> * @return string ID of the widget. 部件唯一标识 </span><span>112</span> <span>*/</span> <span>113</span> <span>public</span> function getId($autoGenerate = <span>true</span><span>) </span><span>114</span> <span> { </span><span>115</span> <span>if</span> ($autoGenerate && $<span>this</span>->_id === <span>null</span><span>) { </span><span>116</span> <span>//</span><span>如果标识为空,并且设置为允许自动生成标识,自动生成</span> <span>117</span> $<span>this</span>->_id = <span>static</span>::$autoIdPrefix . <span>static</span>::$counter++<span>; </span><span>118</span> <span> } </span><span>119</span> <span>120</span> <span>return</span> $<span>this</span>-><span>_id; </span><span>121</span> <span> } </span><span>122</span> <span>123</span> <span>/*</span><span>* </span><span>124</span> <span> * Sets the ID of the widget. 设置小部件标识 </span><span>125</span> <span> * @param string $value id of the widget. 部件的标识。 </span><span>126</span> <span>*/</span> <span>127</span> <span>public</span><span> function setId($value) </span><span>128</span> <span> { </span><span>129</span> $<span>this</span>->_id =<span> $value; </span><span>130</span> <span> } </span><span>131</span> <span>132</span> <span>private</span><span> $_view; </span><span>133</span> <span>134</span> <span>/*</span><span>* </span><span>135</span> <span> * Returns the view object that can be used to render views or view files.返回视图对象 </span><span>136</span> <span> * The [[render()]] and [[renderFile()]] methods will use </span><span>137</span> <span> * this view object to implement the actual view rendering. </span><span>138</span> <span> * [render()]和[renderFile()]方法用视图对象实现实际的视图显示。 </span><span>139</span> <span> * If not set, it will default to the "view" application component. </span><span>140</span> <span> * @return \yii\web\View the view object that can be used to render views or view files. </span><span>141</span> <span>*/</span> <span>142</span> <span>public</span><span> function getView() </span><span>143</span> <span> { </span><span>144</span> <span>if</span> ($<span>this</span>->_view === <span>null</span><span>) { </span><span>145</span> $<span>this</span>->_view = Yii::$app->getView();<span>//</span><span>如果视图对象为空,调用getView()取得视图对象实例</span> <span>146</span> <span> } </span><span>147</span> <span>148</span> <span>return</span> $<span>this</span>-><span>_view; </span><span>149</span> <span> } </span><span>150</span> <span>151</span> <span>/*</span><span>* </span><span>152</span> <span> * Sets the view object to be used by this widget. 设置当前部件调用的视图对象实例 </span><span>153</span> <span> * @param View $view the view object that can be used to render views or view files. </span><span>154</span> <span>*/</span> <span>155</span> <span>public</span><span> function setView($view) </span><span>156</span> <span> { </span><span>157</span> $<span>this</span>->_view = $view;<span>//</span><span>要用的视图对象</span> <span>158</span> <span> } </span><span>159</span> <span>160</span> <span>/*</span><span>* </span><span>161</span> <span> * Executes the widget. 执行部件 </span><span>162</span> <span> * @return string the result of widget execution to be outputted. </span><span>163</span> <span> * 控件执行的结果输出。 </span><span>164</span> <span>*/</span> <span>165</span> <span>public</span><span> function run() </span><span>166</span> <span> { </span><span>167</span> <span> } </span><span>168</span> <span>169</span> <span>/*</span><span>* </span><span>170</span> <span> * Renders a view. </span><span>171</span> <span> * The view to be rendered can be specified in one of the following formats: </span><span>172</span> <span> * 渲染一个视图 实际调用View类中的同名方法 渲染的视图可以用下列方式指定路径 </span><span>173</span> <span> * - path alias (e.g. "@app/views/site/index"); </span><span>174</span> <span> * - absolute path within application (e.g. "//site/index"): the view name starts with double slashes. </span><span>175</span> <span> * The actual view file will be looked for under the [[Application::viewPath|view path]] of the application. </span><span>176</span> <span> * - absolute path within module (e.g. "/site/index"): the view name starts with a single slash. </span><span>177</span> <span> * The actual view file will be looked for under the [[Module::viewPath|view path]] of the currently </span><span>178</span> <span> * active module. </span><span>179</span> <span> * - relative path (e.g. "index"): the actual view file will be looked for under [[viewPath]]. </span><span>180</span> <span> * </span><span>181</span> <span> * If the view name does not contain a file extension, it will use the default one `.php`. </span><span>182</span> <span> * </span><span>183</span> <span> * @param string $view the view name. 视图名 </span><span>184</span> <span> * @param array $params the parameters (name-value pairs) that should be made available in the view. </span><span>185</span> <span> * 在视图中可用的参数 </span><span>186</span> <span> * @return string the rendering result. 渲染结果 </span><span>187</span> <span> * @throws InvalidParamException if the view file does not exist. </span><span>188</span> <span>*/</span> <span>189</span> <span>public</span> function render($view, $<span>params</span> =<span> []) </span><span>190</span> <span> { </span><span>191</span> <span>//</span><span>调用view类中的render渲染指定的视图</span> <span>192</span> <span>return</span> $<span>this</span>->getView()->render($view, $<span>params</span>, $<span>this</span><span>); </span><span>193</span> <span> } </span><span>194</span> <span>195</span> <span>/*</span><span>* </span><span>196</span> <span> * Renders a view file. 渲染一个视图文件 同上 </span><span>197</span> <span> * @param string $file the view file to be rendered. This can be either a file path or a path alias. </span><span>198</span> <span> * @param array $params the parameters (name-value pairs) that should be made available in the view. </span><span>199</span> <span> * @return string the rendering result. </span><span>200</span> <span> * @throws InvalidParamException if the view file does not exist. </span><span>201</span> <span>*/</span> <span>202</span> <span>public</span> function renderFile($file, $<span>params</span> =<span> []) </span><span>203</span> <span> { </span><span>204</span> <span>return</span> $<span>this</span>->getView()->renderFile($file, $<span>params</span>, $<span>this</span><span>); </span><span>205</span> <span> } </span><span>206</span> <span>207</span> <span>/*</span><span>* </span><span>208</span> <span> * Returns the directory containing the view files for this widget. 返回视图文件路径 </span><span>209</span> <span> * The default implementation returns the 'views' subdirectory under the directory containing the widget class file. </span><span>210</span> <span> * @return string the directory containing the view files for this widget. </span><span>211</span> <span>*/</span> <span>212</span> <span>public</span><span> function getViewPath() </span><span>213</span> <span> { </span><span>214</span> $<span>class</span> = <span>new</span> ReflectionClass($<span>this</span><span>); </span><span>215</span> <span>//</span><span>取得部件类文件的目录,拼接为视图目录</span> <span>216</span> <span>return</span> dirname($<span>class</span>->getFileName()) . DIRECTORY_SEPARATOR . <span>'</span><span>views</span><span>'</span><span>; </span><span>217</span> <span> } </span><span>218</span> }

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Xiaohongshu 메모를 삭제하는 방법 Xiaohongshu 앱에서 메모를 편집할 수 있습니다. 다음으로 편집기는 Xiaohongshu 메모 삭제 방법에 대한 사용자 사진과 텍스트를 가져옵니다. 보세요! Xiaohongshu 사용 튜토리얼 Xiaohongshu 메모 삭제 방법 1. 먼저 Xiaohongshu 앱을 열고 메인 페이지로 들어가서 오른쪽 하단에 있는 [Me]를 선택하여 특별 영역으로 들어갑니다. 2. 그런 다음 내 영역에서 다음과 같이 메모 페이지를 클릭합니다. 3. 노트 페이지에 들어가서 오른쪽 상단에 있는 [점 3개]를 클릭합니다. 4. 마지막으로 기능 표시줄이 하단에 확장되고 [삭제]를 클릭하여 완료합니다.

Xiaohongshu 사용자로서 우리 모두는 게시된 노트가 갑자기 사라지는 상황을 경험해 본 적이 있을 것입니다. 이는 의심할 여지 없이 혼란스럽고 걱정스러운 일입니다. 이런 경우, 우리는 어떻게 해야 합니까? 이번 글에서는 "샤오홍슈에서 발행한 노트가 누락된 경우 어떻게 해야 할까요?"라는 주제를 중심으로 자세한 답변을 드리겠습니다. 1. Xiaohongshu에서 발행한 노트가 누락된 경우 어떻게 해야 합니까? 첫째, 당황하지 마십시오. 메모가 누락된 경우 침착함을 유지하는 것이 중요하며 당황하지 마십시오. 이는 플랫폼 시스템 장애 또는 운영 오류로 인해 발생할 수 있습니다. 출시 기록을 확인하는 것은 쉽습니다. Xiaohongshu 앱을 열고 "나" → "게시" → "모든 출판물"을 클릭하면 자신의 출판 기록을 볼 수 있습니다. 여기에서는 이전에 게시된 메모를 쉽게 찾을 수 있습니다. 3.다시 게시합니다. 발견된 경우

Xiaohongshu 노트에 제품 링크를 추가하는 방법 Xiaohongshu 앱에서는 사용자가 다양한 콘텐츠를 탐색할 수 있을 뿐만 아니라 쇼핑도 할 수 있기 때문에 이 앱에는 쇼핑 추천 및 좋은 제품 공유에 대한 콘텐츠가 많이 있습니다. 이 앱에서는 일부 쇼핑 경험을 공유하고, 협력할 판매자를 찾고, 메모에 링크를 추가하는 등의 작업도 할 수 있습니다. 이 앱은 편리할 뿐만 아니라 많은 전문가가 만들 수 있기 때문에 많은 사람들이 쇼핑에 기꺼이 이 앱을 사용합니다. 흥미로운 콘텐츠를 탐색하고 자신에게 맞는 의류 제품이 있는지 확인할 수 있습니다. 노트에 제품 링크를 추가하는 방법을 살펴보겠습니다. 샤오홍슈 노트에 제품 링크를 추가하는 방법 휴대폰 데스크톱에서 앱을 엽니다. 앱 홈페이지를 클릭하세요

C 언어 학습의 매력: 프로그래머의 잠재력을 여는 것 지속적인 기술 발전으로 컴퓨터 프로그래밍은 많은 주목을 받는 분야가 되었습니다. 많은 프로그래밍 언어 중에서 C 언어는 항상 프로그래머들에게 사랑을 받아 왔습니다. C 언어의 단순성, 효율성 및 폭넓은 적용 덕분에 많은 사람들이 프로그래밍 분야에 입문하는 첫 번째 단계는 C 언어입니다. 이 기사에서는 C 언어 학습의 매력과 C 언어 학습을 통해 프로그래머의 잠재력을 발휘하는 방법에 대해 설명합니다. 우선, C 언어 학습의 매력은 단순함에 있습니다. C언어는 다른 프로그래밍 언어에 비해

처음부터 Pygame 배우기: 전체 설치 및 구성 튜토리얼, 특정 코드 예제 필요 소개: Pygame은 Python 프로그래밍 언어를 사용하여 개발된 오픈 소스 게임 개발 라이브러리로, 개발자가 다양한 유형을 쉽게 만들 수 있도록 풍부한 기능과 도구를 제공합니다. 게임의. 이 기사는 처음부터 Pygame을 배우는 데 도움이 될 것이며, 완전한 설치 및 구성 튜토리얼과 빠른 시작을 위한 특정 코드 예제를 제공할 것입니다. 1부: Python 및 Pygame 설치 먼저 다음 사항을 확인하세요.

Word에서 텍스트 내용을 편집할 때 수식 기호를 입력해야 하는 경우가 있습니다. 어떤 사람들은 Word에서 근수를 입력하는 방법을 모르기 때문에 편집자에게 Word에서 근수를 입력하는 방법에 대한 튜토리얼을 친구들과 공유해달라고 요청했습니다. 그것이 내 친구들에게 도움이 되기를 바랍니다. 먼저 컴퓨터에서 Word 소프트웨어를 연 다음 편집하려는 파일을 열고 루트 기호를 삽입해야 하는 위치로 커서를 이동합니다. 아래 그림 예를 참조하세요. 2. [삽입]을 선택한 후, 기호에서 [수식]을 선택하세요. 아래 그림의 빨간색 원과 같이 3. 아래의 [새 수식 삽입]을 선택하세요. 아래 그림의 빨간색 원과 같이 4. [부수]를 선택한 후 해당 부수를 선택합니다. 아래 그림의 빨간색 원에 표시된 대로:

라이프스타일 공유 플랫폼 샤오홍슈는 음식, 여행, 뷰티 등 다양한 분야의 노트를 다루고 있습니다. 많은 사용자가 Xiaohongshu에서 자신의 메모를 공유하고 싶지만 방법을 모릅니다. 이 글에서는 Xiaohongshu에 노트를 게시하는 과정을 자세히 설명하고 플랫폼에서 특정 사용자를 차단하는 방법을 살펴보겠습니다. 1. Xiaohongshu에 노트 튜토리얼을 게시하는 방법은 무엇입니까? 1. 등록 및 로그인: 먼저 휴대폰에 Xiaohongshu 앱을 다운로드하고 등록 및 로그인을 완료해야 합니다. 개인센터에서 개인정보를 작성하는 것은 매우 중요합니다. 아바타를 업로드하고 닉네임과 소개를 입력하면 다른 사용자가 귀하의 정보를 더 쉽게 이해할 수 있을 뿐만 아니라 귀하의 메모에 더 집중할 수 있습니다. 3. 퍼블리싱 채널 선택: 홈페이지 하단에서 '메모 보내기' 버튼을 클릭하고 퍼블리싱하려는 채널을 선택합니다.

jQueryAJAX 오류 403 문제를 해결하는 방법은 무엇입니까? 웹 애플리케이션을 개발할 때 jQuery는 종종 비동기 요청을 보내는 데 사용됩니다. 그러나 때때로 jQueryAJAX를 사용할 때 서버에서 액세스가 금지되었음을 나타내는 오류 코드 403이 발생할 수 있습니다. 이는 일반적으로 서버 측 보안 설정으로 인해 발생하지만 문제를 해결하는 방법이 있습니다. 이 기사에서는 jQueryAJAX 오류 403 문제를 해결하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. 만들다
