目录
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

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

全球最强开源 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是一家探索通用人工智

AI颠覆数学研究!菲尔兹奖得主、华裔数学家领衔11篇顶刊论文|陶哲轩转赞 AI颠覆数学研究!菲尔兹奖得主、华裔数学家领衔11篇顶刊论文|陶哲轩转赞 Apr 09, 2024 am 11:52 AM

AI,的确正在改变数学。最近,一直十分关注这个议题的陶哲轩,转发了最近一期的《美国数学学会通报》(BulletinoftheAmericanMathematicalSociety)。围绕「机器会改变数学吗?」这个话题,众多数学家发表了自己的观点,全程火花四射,内容硬核,精彩纷呈。作者阵容强大,包括菲尔兹奖得主AkshayVenkatesh、华裔数学家郑乐隽、纽大计算机科学家ErnestDavis等多位业界知名学者。AI的世界已经发生了天翻地覆的变化,要知道,其中很多文章是在一年前提交的,而在这一

谷歌狂喜:JAX性能超越Pytorch、TensorFlow!或成GPU推理训练最快选择 谷歌狂喜: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进行了基准测试。首先,他们为生成式和非生成式人工智能任务选择了一组主流

你好,电动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