模型类DynamicModel主要用于实现模型内的数据验证yii2\base\DynamicModel.php

 <?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace yii\base; use yii\validators\Validator; /**
* DynamicModel is a model class primarily used to support ad hoc data validation.
* DynamicModel是一种主要用于支持ad hoc数据验证模型类
* The typical usage of DynamicModel is as follows,
*
* ```php
* public function actionSearch($name, $email)
* {
* $model = DynamicModel::validateData(compact('name', 'email'), [
* [['name', 'email'], 'string', 'max' => 128],
* ['email', 'email'],
* ]);
* if ($model->hasErrors()) {
* // validation fails
* } else {
* // validation succeeds
* }
* }
* ```
*
* The above example shows how to validate `$name` and `$email` with the help of DynamicModel.
* 上面的例子演示了如何用DynamicModel验证用户名`$name`和邮箱`$email`
* The [[validateData()]] method creates an instance of DynamicModel, defines the attributes
* using the given data (`name` and `email` in this example), and then calls [[Model::validate()]].
* validateData() 方法会创建一个 DynamicModel 的实例对象。通过给定数据定义模型特性,之后调用Model::validate() 方法。
* You can check the validation result by [[hasErrors()]], like you do with a normal model.
* You may also access the dynamic attributes defined through the model instance, e.g.,
* 可以通过[[hasErrors()]]方法获取验证结果
* `$model->name` and `$model->email`.
*
* Alternatively, you may use the following more "classic" syntax to perform ad-hoc data validation:
* 除此之外,你也可以用如下的更加“classic(传统)”的语法来执行临时数据验
* ```php
* $model = new DynamicModel(compact('name', 'email'));
* $model->addRule(['name', 'email'], 'string', ['max' => 128])
* ->addRule('email', 'email')
* ->validate();
* ```
*
* DynamicModel implements the above ad-hoc data validation feature by supporting the so-called
* "dynamic attributes". It basically allows an attribute to be defined dynamically through its constructor
* or [[defineAttribute()]].
* 实现了上述特殊数据模型验证功能支持的“动态属性”。允许通过它的构造函数或 [[defineAttribute()]]来定义一个属性
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
class DynamicModel extends Model
{
private $_attributes = [];//动态模型内动态属性 /**
* Constructors.构造函数,用于将传入的属性赋值给_attributes,便于使用
* @param array $attributes the dynamic attributes (name-value pairs, or names) being defined被定义的动态属性
* @param array $config the configuration array to be applied to this object.用于该对象的配置数组。
*/
public function __construct(array $attributes = [], $config = [])
{
foreach ($attributes as $name => $value) {//遍历传入的属性
if (is_integer($name)) {//如果是整型,说明只传入了属性名,将属性名写入_attributes
$this->_attributes[$value] = null;
} else {
$this->_attributes[$name] = $value;//按键值对的形式写入
}
}
parent::__construct($config);//调用父类的配置
} /**
* @inheritdoc 重写__get方法,从_attributes中取值
*/
public function __get($name)
{
if (array_key_exists($name, $this->_attributes)) {
//如果传入的$name在数组_attributes中存在,则从_attributes中取值
return $this->_attributes[$name];
} else {//否则调用父类的__get方法取属性值
return parent::__get($name);
}
} /**
* @inheritdoc 重写__set方法,给_attributes设置值
*/
public function __set($name, $value)
{
if (array_key_exists($name, $this->_attributes)) {
//如果传入的$name在数组_attributes中存在,则将动态属性$name的值设置为$value
$this->_attributes[$name] = $value;
} else {
parent::__set($name, $value);//调用父类的__set方法设置属性值
}
} /**
* @inheritdoc 同上 重写__isset方法,判断_attributes中是否设置$name值
*/
public function __isset($name)
{
if (array_key_exists($name, $this->_attributes)) {
return isset($this->_attributes[$name]);
} else {
return parent::__isset($name);
}
} /**
* @inheritdoc 同上,重写__unset方法,删除_attributes中的$name属性值
*/
public function __unset($name)
{
if (array_key_exists($name, $this->_attributes)) {
unset($this->_attributes[$name]);
} else {
parent::__unset($name);
}
} /**
* Defines an attribute. 定义动态属性的方法
* @param string $name the attribute name 属性名
* @param mixed $value the attribute value 属性值
*/
public function defineAttribute($name, $value = null)
{
$this->_attributes[$name] = $value;
} /**
* Undefines an attribute. 用于删除动态属性的方法
* @param string $name the attribute name 属性名
*/
public function undefineAttribute($name)
{
unset($this->_attributes[$name]);
} /**
* Adds a validation rule to this model. 添加验证规则
* You can also directly manipulate [[validators]] to add or remove validation rules.
* This method provides a shortcut.
* 可以直接调用[[validators]]来添加或者删除验证规则,本方法提供了一个短方法
* @param string|array $attributes the attribute(s) to be validated by the rule 进行验证的属性
* @param mixed $validator the validator for the rule.This can be a built-in validator name,
* a method name of the model class, an anonymous function, or a validator class name.
* 规则的验证。这是一个内置验证器的名字, 一个模型类的方法名,一个匿名函数或一个验证器类的名称。
* @param array $options the options (name-value pairs) to be applied to the validator
* (name-value)被应用到验证器
* @return static the model itself 模型本身
*/
public function addRule($attributes, $validator, $options = [])
{
$validators = $this->getValidators();//所有的验证规则对象
//生成Validator对象,并且插入 $validators中
$validators->append(Validator::createValidator($validator, $this, (array) $attributes, $options)); return $this;
} /**
* Validates the given data with the specified validation rules.通过指定的规则验证给定的数据
* This method will create a DynamicModel instance, populate it with the data to be validated,
* create the specified validation rules, and then validate the data using these rules.
* @param array $data the data (name-value pairs) to be validated
* @param array $rules the validation rules. Please refer to [[Model::rules()]] on the format of this parameter.
* @return static the model instance that contains the data being validated
* @throws InvalidConfigException if a validation rule is not specified correctly.
*/
public static function validateData(array $data, $rules = [])
{
/* @var $model DynamicModel */
$model = new static($data);//实例化调用类,将$data赋值给_attributes
if (!empty($rules)) {
$validators = $model->getValidators();//获取所有定义的验证规则
foreach ($rules as $rule) {
if ($rule instanceof Validator) {
$validators->append($rule);//如果$rule是Validator的实例,则添加到$validators中
} elseif (is_array($rule) && isset($rule[], $rule[])) { // attributes, validator type
//如果$rule是数组,则判断动态属性和验证类型是否存在,创建Validator对象,添加到$validators中
$validator = Validator::createValidator($rule[], $model, (array) $rule[], array_slice($rule, ));
$validators->append($validator);
} else {//抛出异常
throw new InvalidConfigException('Invalid validation rule: a rule must specify both attribute names and validator type.');
}
}
} $model->validate();//执行验证 return $model;
} /**
* @inheritdoc 返回所有的动态属性
*/
public function attributes()
{
return array_keys($this->_attributes);
}
}

yii2源码学习笔记(十三)的更多相关文章

  1. yii2源码学习笔记(九)

    Application是所有应用程序类的基类,接下来了解一下它的源码.yii2\base\Application.php. <?php /** * @link http://www.yiifra ...

  2. yii2源码学习笔记(八)

    Action是所有控制器的基类,接下来了解一下它的源码.yii2\base\Action.php <?php /** * @link http://www.yiiframework.com/ * ...

  3. 老刘 Yii2 源码学习笔记之 Action 类

    Action 的概述 InlineAction 就是内联动作,所谓的内联动作就是放到controller 里面的 actionXXX 这种 Action.customAction 就是独立动作,就是直 ...

  4. yii2源码学习笔记(二十)

    Widget类是所有部件的基类.yii2\base\Widget.php <?php /** * @link http://www.yiiframework.com/ * @copyright ...

  5. yii2源码学习笔记(十八)

    View继承了component,用于渲染视图文件:yii2\base\View.php <?php /** * @link http://www.yiiframework.com/ * @co ...

  6. yii2源码学习笔记(十七)

    Theme 类,应用的主题,通过替换路径实现主题的应用,方法为获取根路径和根链接:yii2\base\Theme.php <?php /** * @link http://www.yiifram ...

  7. yii2源码学习笔记(十四)

    Module类是模块和应用类的基类. yiisoft\yii2\base\Module.php <?php /** * @link http://www.yiiframework.com/ * ...

  8. yii2源码学习笔记(十一)

    Controller控制器类,是所有控制器的基类,用于调用模型和布局. <?php /** * @link http://www.yiiframework.com/ * @copyright C ...

  9. yii2源码学习笔记(六)

    Behvaior类,Behavior类是所有事件类的基类: 目录yii2\base\Behavior.php <?php /** * @link http://www.yiiframework. ...

随机推荐

  1. 用Regex类计算一个字符串出现次数是最好方法【转载】

    我的一个朋友问我,怎么在c#或vb.net中,计算一个字符串中查找另一个字符串中出现的次数,他说在网上打了好多方法,我看了一下,有的是用replace的方法去实现,这种方法不是太好,占资源太大了.其实 ...

  2. MySQL check the manual that corresponds to your MySQL server version for the right syntax错误

    地化GO的时候一直遇到一个错误就是check the manual that corresponds to your MySQL server version for the right syntax ...

  3. cocos2dx 3.1创建工 mac

    1.下载cocos2dx 3.1版本号 2.打开终端,cd 进入 cocos2d-x-3.1.1/tools/cocos2d-console/bin 3.cocos new game -p com.t ...

  4. tr 命令 操作字符串中字符 删除替换 等

    ip=$(cat ${path}initOauth/initinfo.txt |awk '{if(NR==1)print $0;}'|tr -d '\r'); tr命令可以对来自标准输入的字符进行替换 ...

  5. Could not find class &#39;****&#39;, referenced from method #####

    找不到类,多半也是和第三方的jar包有关. 将找不到的类.在下图中的地方勾选出来.假设jar太多.有的类有冲突的话,须要明白其先后顺序. 请外一篇和第三方jar有关的异常的文章. Conversion ...

  6. Android 读取手机短信

    获取android手机短信需要在AndroidManifest.xml加权限: <uses-permission android:name="android.permission.RE ...

  7. javaHDU1003Max Sum

    import java.util.Scanner;  public class Sum  {public static void main(String args[])  {Scanner cin=n ...

  8. cglib源码分析(三):Class生成策略

    cglib中生成类的工作是由AbstractClassGenerator的create方法使用相应的生成策略完成,具体代码如下: private GeneratorStrategy strategy ...

  9. mysql远程连接错误提醒:2013-Lost connection to MySQL server at ‘reading initial communication packet', system error: 0

    因为没有匹配/etc/hosts.allow. 解决方法: 1.在hosts.allow 文件中添加 mysqld:ALL [root@ucDB204 ~]# cat /etc/hosts.allow ...

  10. [转]ORACLE 绑定变量用法总结

    转:http://blog.csdn.net/wanghai__/article/details/4778343 在oracle 中,对于一个提交的sql语句,存在两种可选的解析过程, 一种叫做硬解析 ...