目錄
yii2源码学习笔记(十三),yii2源码学习笔记
首頁 php教程 php手册 yii2源码学习笔记(十三),yii2源码学习笔记

yii2源码学习笔记(十三),yii2源码学习笔记

Jun 13, 2016 am 08:38 AM
yii2 主要 十三 學習 實現 模型 原始碼 筆記 類別

yii2源码学习笔记(十三),yii2源码学习笔记

模型类DynamicModel主要用于实现模型内的数据验证yii2\base\DynamicModel.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>namespace</span> yii\<span>base</span><span>;
</span><span>  8</span> 
<span>  9</span> <span>use yii\validators\Validator;
</span><span> 10</span> 
<span> 11</span> <span>/*</span><span>*
</span><span> 12</span> <span> * DynamicModel is a model class primarily used to support ad hoc data validation.
</span><span> 13</span> <span> * DynamicModel是一种主要用于支持ad hoc数据验证模型类
</span><span> 14</span> <span> * The typical usage of DynamicModel is as follows,
</span><span> 15</span> <span> *
</span><span> 16</span> <span> * ```php
</span><span> 17</span> <span> * public function actionSearch($name, $email)
</span><span> 18</span> <span> * {
</span><span> 19</span> <span> *     $model = DynamicModel::validateData(compact('name', 'email'), [
</span><span> 20</span> <span> *         [['name', 'email'], 'string', 'max' => 128],
</span><span> 21</span> <span> *         ['email', 'email'],
</span><span> 22</span> <span> *     ]);
</span><span> 23</span> <span> *     if ($model->hasErrors()) {
</span><span> 24</span> <span> *         // validation fails
</span><span> 25</span> <span> *     } else {
</span><span> 26</span> <span> *         // validation succeeds
</span><span> 27</span> <span> *     }
</span><span> 28</span> <span> * }
</span><span> 29</span> <span> * ```
</span><span> 30</span> <span> *
</span><span> 31</span> <span> * The above example shows how to validate `$name` and `$email` with the help of DynamicModel.
</span><span> 32</span> <span> * 上面的例子演示了如何用DynamicModel验证用户名`$name`和邮箱`$email`
</span><span> 33</span> <span> * The [[validateData()]] method creates an instance of DynamicModel, defines the attributes
</span><span> 34</span> <span> * using the given data (`name` and `email` in this example), and then calls [[Model::validate()]].
</span><span> 35</span> <span> * validateData() 方法会创建一个 DynamicModel 的实例对象。通过给定数据定义模型特性,之后调用Model::validate() 方法。
</span><span> 36</span> <span> * You can check the validation result by [[hasErrors()]], like you do with a normal model.
</span><span> 37</span> <span> * You may also access the dynamic attributes defined through the model instance, e.g.,
</span><span> 38</span> <span> * 可以通过[[hasErrors()]]方法获取验证结果
</span><span> 39</span> <span> * `$model->name` and `$model->email`.
</span><span> 40</span> <span> *
</span><span> 41</span> <span> * Alternatively, you may use the following more "classic" syntax to perform ad-hoc data validation:
</span><span> 42</span> <span> *  除此之外,你也可以用如下的更加&ldquo;classic(传统)&rdquo;的语法来执行临时数据验
</span><span> 43</span> <span> * ```php
</span><span> 44</span> <span> * $model = new DynamicModel(compact('name', 'email'));
</span><span> 45</span> <span> * $model->addRule(['name', 'email'], 'string', ['max' => 128])
</span><span> 46</span> <span> *     ->addRule('email', 'email')
</span><span> 47</span> <span> *     ->validate();
</span><span> 48</span> <span> * ```
</span><span> 49</span> <span> *
</span><span> 50</span> <span> * DynamicModel implements the above ad-hoc data validation feature by supporting the so-called
</span><span> 51</span> <span> * "dynamic attributes". It basically allows an attribute to be defined dynamically through its constructor
</span><span> 52</span> <span> * or [[defineAttribute()]].
</span><span> 53</span> <span> * 实现了上述特殊数据模型验证功能支持的&ldquo;动态属性&rdquo;。允许通过它的构造函数或 [[defineAttribute()]]来定义一个属性
</span><span> 54</span> <span> * @author Qiang Xue <qiang.xue@gmail.com>
</span><span> 55</span> <span> * @since 2.0
</span><span> 56</span>  <span>*/</span>
<span> 57</span> <span>class</span><span> DynamicModel extends Model
</span><span> 58</span> <span>{
</span><span> 59</span>     <span>private</span> $_attributes = [];<span>//</span><span>动态模型内动态属性</span>
<span> 60</span> 
<span> 61</span> 
<span> 62</span>     <span>/*</span><span>*
</span><span> 63</span> <span>     * Constructors.构造函数,用于将传入的属性赋值给_attributes,便于使用
</span><span> 64</span> <span>     * @param array $attributes the dynamic attributes (name-value pairs, or names) being defined被定义的动态属性
</span><span> 65</span> <span>     * @param array $config the configuration array to be applied to this object.用于该对象的配置数组。
</span><span> 66</span>      <span>*/</span>
<span> 67</span>     <span>public</span> function __construct(array $attributes = [], $config =<span> [])
</span><span> 68</span> <span>    {
</span><span> 69</span>         <span>foreach</span> ($attributes <span>as</span> $name => $value) {<span>//</span><span>遍历传入的属性</span>
<span> 70</span>             <span>if</span> (is_integer($name)) {<span>//</span><span>如果是整型,说明只传入了属性名,将属性名写入_attributes</span>
<span> 71</span>                 $<span>this</span>->_attributes[$value] = <span>null</span><span>;
</span><span> 72</span>             } <span>else</span><span> {
</span><span> 73</span>                 $<span>this</span>->_attributes[$name] = $value;<span>//</span><span>按键值对的形式写入</span>
<span> 74</span> <span>            }
</span><span> 75</span> <span>        }
</span><span> 76</span>         parent::__construct($config);<span>//</span><span>调用父类的配置</span>
<span> 77</span> <span>    }
</span><span> 78</span> 
<span> 79</span>     <span>/*</span><span>*
</span><span> 80</span> <span>     * @inheritdoc 重写__get方法,从_attributes中取值
</span><span> 81</span>      <span>*/</span>
<span> 82</span>     <span>public</span><span> function __get($name)
</span><span> 83</span> <span>    {
</span><span> 84</span>         <span>if</span> (array_key_exists($name, $<span>this</span>-><span>_attributes)) {
</span><span> 85</span>             <span>//</span><span>如果传入的$name在数组_attributes中存在,则从_attributes中取值</span>
<span> 86</span>             <span>return</span> $<span>this</span>-><span>_attributes[$name];
</span><span> 87</span>         } <span>else</span> {<span>//</span><span>否则调用父类的__get方法取属性值</span>
<span> 88</span>             <span>return</span><span> parent::__get($name);
</span><span> 89</span> <span>        }
</span><span> 90</span> <span>    }
</span><span> 91</span> 
<span> 92</span>     <span>/*</span><span>*
</span><span> 93</span> <span>     * @inheritdoc 重写__set方法,给_attributes设置值
</span><span> 94</span>      <span>*/</span>
<span> 95</span>     <span>public</span><span> function __set($name, $value)
</span><span> 96</span> <span>    {
</span><span> 97</span>         <span>if</span> (array_key_exists($name, $<span>this</span>-><span>_attributes)) {
</span><span> 98</span>             <span>//</span><span>如果传入的$name在数组_attributes中存在,则将动态属性$name的值设置为$value</span>
<span> 99</span>             $<span>this</span>->_attributes[$name] =<span> $value;
</span><span>100</span>         } <span>else</span><span> {
</span><span>101</span>             parent::__set($name, $value);<span>//</span><span>调用父类的__set方法设置属性值</span>
<span>102</span> <span>        }
</span><span>103</span> <span>    }
</span><span>104</span> 
<span>105</span>     <span>/*</span><span>*
</span><span>106</span> <span>     * @inheritdoc 同上 重写__isset方法,判断_attributes中是否设置$name值
</span><span>107</span>      <span>*/</span>
<span>108</span>     <span>public</span><span> function __isset($name)
</span><span>109</span> <span>    {
</span><span>110</span>         <span>if</span> (array_key_exists($name, $<span>this</span>-><span>_attributes)) {
</span><span>111</span>             <span>return</span> isset($<span>this</span>-><span>_attributes[$name]);
</span><span>112</span>         } <span>else</span><span> {
</span><span>113</span>             <span>return</span><span> parent::__isset($name);
</span><span>114</span> <span>        }
</span><span>115</span> <span>    }
</span><span>116</span> 
<span>117</span>     <span>/*</span><span>*
</span><span>118</span> <span>     * @inheritdoc 同上,重写__unset方法,删除_attributes中的$name属性值
</span><span>119</span>      <span>*/</span>
<span>120</span>     <span>public</span><span> function __unset($name)
</span><span>121</span> <span>    {
</span><span>122</span>         <span>if</span> (array_key_exists($name, $<span>this</span>-><span>_attributes)) {
</span><span>123</span>             unset($<span>this</span>-><span>_attributes[$name]);
</span><span>124</span>         } <span>else</span><span> {
</span><span>125</span> <span>            parent::__unset($name);
</span><span>126</span> <span>        }
</span><span>127</span> <span>    }
</span><span>128</span> 
<span>129</span>     <span>/*</span><span>*
</span><span>130</span> <span>     * Defines an attribute. 定义动态属性的方法
</span><span>131</span> <span>     * @param string $name the attribute name   属性名
</span><span>132</span> <span>     * @param mixed $value the attribute value  属性值
</span><span>133</span>      <span>*/</span>
<span>134</span>     <span>public</span> function defineAttribute($name, $value = <span>null</span><span>)
</span><span>135</span> <span>    {
</span><span>136</span>         $<span>this</span>->_attributes[$name] =<span> $value;
</span><span>137</span> <span>    }
</span><span>138</span> 
<span>139</span>     <span>/*</span><span>*
</span><span>140</span> <span>     * Undefines an attribute. 用于删除动态属性的方法
</span><span>141</span> <span>     * @param string $name the attribute name 属性名
</span><span>142</span>      <span>*/</span>
<span>143</span>     <span>public</span><span> function undefineAttribute($name)
</span><span>144</span> <span>    {
</span><span>145</span>         unset($<span>this</span>-><span>_attributes[$name]);
</span><span>146</span> <span>    }
</span><span>147</span> 
<span>148</span>     <span>/*</span><span>*
</span><span>149</span> <span>     * Adds a validation rule to this model.    添加验证规则
</span><span>150</span> <span>     * You can also directly manipulate [[validators]] to add or remove validation rules.
</span><span>151</span> <span>     * This method provides a shortcut.
</span><span>152</span> <span>     * 可以直接调用[[validators]]来添加或者删除验证规则,本方法提供了一个短方法
</span><span>153</span> <span>     * @param string|array $attributes the attribute(s) to be validated by the rule 进行验证的属性
</span><span>154</span> <span>     * @param mixed $validator the validator for the rule.This can be a built-in validator name,
</span><span>155</span> <span>     * a method name of the model class, an anonymous function, or a validator class name.
</span><span>156</span> <span>     * 规则的验证。这是一个内置验证器的名字, 一个模型类的方法名,一个匿名函数或一个验证器类的名称。
</span><span>157</span> <span>     * @param array $options the options (name-value pairs) to be applied to the validator
</span><span>158</span> <span>     *  (name-value)被应用到验证器
</span><span>159</span> <span>     * @return static the model itself  模型本身
</span><span>160</span>      <span>*/</span>
<span>161</span>     <span>public</span> function addRule($attributes, $validator, $options =<span> [])
</span><span>162</span> <span>    {
</span><span>163</span>         $validators = $<span>this</span>->getValidators();<span>//</span><span>所有的验证规则对象
</span><span>164</span>         <span>//</span><span>生成Validator对象,并且插入 $validators中</span>
<span>165</span>         $validators->append(Validator::createValidator($validator, $<span>this</span><span>, (array) $attributes, $options));
</span><span>166</span> 
<span>167</span>         <span>return</span> $<span>this</span><span>;
</span><span>168</span> <span>    }
</span><span>169</span> 
<span>170</span>     <span>/*</span><span>*
</span><span>171</span> <span>     * Validates the given data with the specified validation rules.通过指定的规则验证给定的数据
</span><span>172</span> <span>     * This method will create a DynamicModel instance, populate it with the data to be validated,
</span><span>173</span> <span>     * create the specified validation rules, and then validate the data using these rules.
</span><span>174</span> <span>     * @param array $data the data (name-value pairs) to be validated
</span><span>175</span> <span>     * @param array $rules the validation rules. Please refer to [[Model::rules()]] on the format of this parameter.
</span><span>176</span> <span>     * @return static the model instance that contains the data being validated
</span><span>177</span> <span>     * @throws InvalidConfigException if a validation rule is not specified correctly.
</span><span>178</span>      <span>*/</span>
<span>179</span>     <span>public</span> <span>static</span> function validateData(array $data, $rules =<span> [])
</span><span>180</span> <span>    {
</span><span>181</span>         <span>/*</span><span> @var $model DynamicModel </span><span>*/</span>
<span>182</span>         $model = <span>new</span> <span>static</span>($data);<span>//</span><span>实例化调用类,将$data赋值给_attributes</span>
<span>183</span>         <span>if</span> (!<span>empty($rules)) {
</span><span>184</span>             $validators = $model->getValidators();<span>//</span><span>获取所有定义的验证规则</span>
<span>185</span>             <span>foreach</span> ($rules <span>as</span><span> $rule) {
</span><span>186</span>                 <span>if</span><span> ($rule instanceof Validator) {
</span><span>187</span>                     $validators->append($rule);<span>//</span><span>如果$rule是Validator的实例,则添加到$validators中</span>
<span>188</span>                 } elseif (is_array($rule) && isset($rule[<span>0</span>], $rule[<span>1</span>])) { <span>//</span><span> attributes, validator type
</span><span>189</span>                      <span>//</span><span>如果$rule是数组,则判断动态属性和验证类型是否存在,创建Validator对象,添加到$validators中</span>
<span>190</span>                     $validator = Validator::createValidator($rule[<span>1</span>], $model, (array) $rule[<span>0</span>], array_slice($rule, <span>2</span><span>));
</span><span>191</span>                     $validators-><span>append($validator);
</span><span>192</span>                 } <span>else</span> {<span>//</span><span>抛出异常</span>
<span>193</span>                     <span>throw</span> <span>new</span> InvalidConfigException(<span>'</span><span>Invalid validation rule: a rule must specify both attribute names and validator type.</span><span>'</span><span>);
</span><span>194</span> <span>                }
</span><span>195</span> <span>            }
</span><span>196</span> <span>        }
</span><span>197</span> 
<span>198</span>         $model->validate();<span>//</span><span>执行验证</span>
<span>199</span> 
<span>200</span>         <span>return</span><span> $model;
</span><span>201</span> <span>    }
</span><span>202</span> 
<span>203</span>     <span>/*</span><span>*
</span><span>204</span> <span>     * @inheritdoc  返回所有的动态属性
</span><span>205</span>      <span>*/</span>
<span>206</span>     <span>public</span><span> function attributes()
</span><span>207</span> <span>    {
</span><span>208</span>         <span>return</span> array_keys($<span>this</span>-><span>_attributes);
</span><span>209</span> <span>    }
</span><span>210</span> }
登入後複製

 

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1325
25
PHP教程
1272
29
C# 教程
1252
24
全球最強開源 MoE 模型來了,中文能力比肩 GPT-4,價格僅 GPT-4-Turbo 的近百分之一 全球最強開源 MoE 模型來了,中文能力比肩 GPT-4,價格僅 GPT-4-Turbo 的近百分之一 May 07, 2024 pm 04:13 PM

想像一下,一個人工智慧模型,不僅擁有超越傳統運算的能力,還能以更低的成本實現更有效率的效能。這不是科幻,DeepSeek-V2[1],全球最強開源MoE模型來了。 DeepSeek-V2是一個強大的專家混合(MoE)語言模型,具有訓練經濟、推理高效的特點。它由236B個參數組成,其中21B個參數用於啟動每個標記。與DeepSeek67B相比,DeepSeek-V2效能更強,同時節省了42.5%的訓練成本,減少了93.3%的KV緩存,最大生成吞吐量提高到5.76倍。 DeepSeek是一家探索通用人工智

Google狂喜:JAX性能超越Pytorch、TensorFlow!或成GPU推理訓練最快選擇 Google狂喜:JAX性能超越Pytorch、TensorFlow!或成GPU推理訓練最快選擇 Apr 01, 2024 pm 07:46 PM

谷歌力推的JAX在最近的基準測試中表現已經超過Pytorch和TensorFlow,7項指標排名第一。而且測試並不是JAX性能表現最好的TPU上完成的。雖然現在在開發者中,Pytorch依然比Tensorflow更受歡迎。但未來,也許有更多的大型模型會基於JAX平台進行訓練和運行。模型最近,Keras團隊為三個後端(TensorFlow、JAX、PyTorch)與原生PyTorch實作以及搭配TensorFlow的Keras2進行了基準測試。首先,他們為生成式和非生成式人工智慧任務選擇了一組主流

AI顛覆數學研究!菲爾茲獎得主、華裔數學家領銜11篇頂刊論文|陶哲軒轉贊 AI顛覆數學研究!菲爾茲獎得主、華裔數學家領銜11篇頂刊論文|陶哲軒轉贊 Apr 09, 2024 am 11:52 AM

AI,的確正在改變數學。最近,一直十分關注這個議題的陶哲軒,轉發了最近一期的《美國數學學會通報》(BulletinoftheAmericanMathematicalSociety)。圍繞著「機器會改變數學嗎?」這個話題,許多數學家發表了自己的觀點,全程火花四射,內容硬核,精彩紛呈。作者陣容強大,包括菲爾茲獎得主AkshayVenkatesh、華裔數學家鄭樂雋、紐大電腦科學家ErnestDavis等多位業界知名學者。 AI的世界已經發生了天翻地覆的變化,要知道,其中許多文章是在一年前提交的,而在這一

你好,電動Atlas!波士頓動力機器人復活,180度詭異動作嚇到馬斯克 你好,電動Atlas!波士頓動力機器人復活,180度詭異動作嚇到馬斯克 Apr 18, 2024 pm 07:58 PM

波士頓動力Atlas,正式進入電動機器人時代!昨天,液壓Atlas剛「含淚」退出歷史舞台,今天波士頓動力就宣布:電動Atlas上崗。看來,在商用人形機器人領域,波士頓動力是下定決心要跟特斯拉硬剛一把了。新影片放出後,短短十幾小時內,就已經有一百多萬觀看。舊人離去,新角色登場,這是歷史的必然。毫無疑問,今年是人形機器人的爆發年。網友銳評:機器人的進步,讓今年看起來像人類的開幕式動作、自由度遠超人類,但這真不是恐怖片?影片一開始,Atlas平靜地躺在地上,看起來應該是仰面朝天。接下來,讓人驚掉下巴

替代MLP的KAN,被開源專案擴展到卷積了 替代MLP的KAN,被開源專案擴展到卷積了 Jun 01, 2024 pm 10:03 PM

本月初,來自MIT等機構的研究者提出了一種非常有潛力的MLP替代方法—KAN。 KAN在準確性和可解釋性方面表現優於MLP。而且它能以非常少的參數量勝過以更大參數量運行的MLP。例如,作者表示,他們用KAN以更小的網路和更高的自動化程度重現了DeepMind的結果。具體來說,DeepMind的MLP有大約300,000個參數,而KAN只有約200個參數。 KAN與MLP一樣具有強大的數學基礎,MLP基於通用逼近定理,而KAN基於Kolmogorov-Arnold表示定理。如下圖所示,KAN在邊上具

特斯拉機器人進廠打工,馬斯克:手的自由度今年將達到22個! 特斯拉機器人進廠打工,馬斯克:手的自由度今年將達到22個! May 06, 2024 pm 04:13 PM

特斯拉機器人Optimus最新影片出爐,已經可以在工廠裡打工了。正常速度下,它分揀電池(特斯拉的4680電池)是這樣的:官方還放出了20倍速下的樣子——在小小的「工位」上,揀啊揀啊揀:這次放出的影片亮點之一在於Optimus在廠子裡完成這項工作,是完全自主的,全程沒有人為的干預。而且在Optimus的視角之下,它還可以把放歪了的電池重新撿起來放置,主打一個自動糾錯:對於Optimus的手,英偉達科學家JimFan給出了高度的評價:Optimus的手是全球五指機器人裡最靈巧的之一。它的手不僅有觸覺

FisheyeDetNet:首個以魚眼相機為基礎的目標偵測演算法 FisheyeDetNet:首個以魚眼相機為基礎的目標偵測演算法 Apr 26, 2024 am 11:37 AM

目標偵測在自動駕駛系統當中是一個比較成熟的問題,其中行人偵測是最早得以部署演算法之一。在多數論文當中已經進行了非常全面的研究。然而,利用魚眼相機進行環視的距離感知相對來說研究較少。由於徑向畸變大,標準的邊界框表示在魚眼相機當中很難實施。為了緩解上述描述,我們探索了擴展邊界框、橢圓、通用多邊形設計為極座標/角度表示,並定義一個實例分割mIOU度量來分析這些表示。所提出的具有多邊形形狀的模型fisheyeDetNet優於其他模型,並同時在用於自動駕駛的Valeo魚眼相機資料集上實現了49.5%的mAP

牛津大學最新! Mickey:3D中的2D影像匹配SOTA! (CVPR\'24) 牛津大學最新! Mickey:3D中的2D影像匹配SOTA! (CVPR\'24) Apr 23, 2024 pm 01:20 PM

寫在前面項目連結:https://nianticlabs.github.io/mickey/給定兩張圖片,可以透過建立圖片之間的對應關係來估計它們之間的相機姿態。通常,這些對應關係是二維到二維的,而我們估計的姿態在尺度上是不確定的。一些應用,例如隨時隨地實現即時增強現實,需要尺度度量的姿態估計,因此它們依賴外部的深度估計器來恢復尺度。本文提出了MicKey,這是一個關鍵點匹配流程,能夠夠預測三維相機空間中的度量對應關係。透過學習跨影像的三維座標匹配,我們能夠在沒有深度測試的情況下推斷度量相對

See all articles