没有命名空间的类 yii yii\base yii\behaviors yii\caching yii\captcha yii\console yii\console\controllers yii\console\widgets yii\data yii\db yii\db\conditions yii\db\cubrid yii\db\cubrid\conditions yii\db\mssql yii\db\mssql\conditions yii\db\mysql yii\db\oci yii\db\oci\conditions yii\db\pgsql yii\db\sqlite yii\db\sqlite\conditions yii\di yii\filters yii\filters\auth yii\grid yii\helpers yii\i18n yii\log yii\mail yii\mutex yii\rbac yii\rest yii\test yii\validators yii\web yii\widgets

Class yii\behaviors\AttributeTypecastBehavior

继承yii\behaviors\AttributeTypecastBehavior » yii\base\Behavior » yii\base\BaseObject
实现yii\base\Configurable
可用版本自2.0.10
源码 https://github.com/yiichina/yii2/blob/api/framework/behaviors/AttributeTypecastBehavior.php

AttributeTypecastBehavior 提供了模型属性自动转换数据类型的能力。 这个行为在数据库语法比较弱化的数据库系统上使用 ActiveRecord 时比较有用,比如 MongoDB 或者 Redis 这些数据库。 它也可以在普通的 yii\db\ActiveRecord 甚至 yii\base\Model 上发挥作用。 因为它能够在执行模型验证之后保持严格的属性数据类型。

这个行为应该附加到 yii\base\Model 或者 yii\db\BaseActiveRecord 的子类中使用。

你应该通过 $attributeTypes 指明确切的数据类型。

比如:

use yii\behaviors\AttributeTypecastBehavior;

class Item extends \yii\db\ActiveRecord
{
    public function behaviors()
    {
        return [
            'typecast' => [
                'class' => AttributeTypecastBehavior::className(),
                'attributeTypes' => [
                    'amount' => AttributeTypecastBehavior::TYPE_INTEGER,
                    'price' => AttributeTypecastBehavior::TYPE_FLOAT,
                    'is_active' => AttributeTypecastBehavior::TYPE_BOOLEAN,
                ],
                'typecastAfterValidate' => true,
                'typecastBeforeSave' => false,
                'typecastAfterFind' => false,
            ],
        ];
    }

    // ...
}

Tip: 你可以把 $attributeTypes 留空, 这时行为将通过属主组件的验证规则自动组装它的值。 下面的例子展示了 $attributeTypes 是根据它上面的 rules 方法里的验证规则创建了一模一样的数据类型:

use yii\behaviors\AttributeTypecastBehavior;

class Item extends \yii\db\ActiveRecord
{

    public function rules()
    {
        return [
            ['amount', 'integer'],
            ['price', 'number'],
            ['is_active', 'boolean'],
        ];
    }

    public function behaviors()
    {
        return [
            'typecast' => [
                'class' => AttributeTypecastBehavior::className(),
                // 'attributeTypes' will be composed automatically according to `rules()`
            ],
        ];
    }

    // ...
}

这个行为允许自动类型转换发生在如下的场景:

  • 在成功通过模型验证之后
  • 在模型保存之前(插入或者更新)
  • 在模型查找之后(通过查询语句找到模型或模型执行刷新)

你可以通过使用 $typecastAfterValidate$typecastBeforeSave$typecastAfterFind 来控制自动转换发生在哪些指定的场景。 默认情况下只在模型成功通过验证之后进行类型转换。

Note: 你也可以在任何时候手动地通过调用 typecastAttributes() 方法触发属性的类型转换:

$model = new Item();
$model->price = '38.5';
$model->is_active = 1;
$model->typecastAttributes();

公共属性

隐藏继承的属性

属性类型描述被定义在
$attributeTypes array 属性进行类型转换的格式:attributeName => type。 Type 可以是一个 PHP 匿名函数, 它接收属性的原始值作为参数并且应该返回类型转换的结果。 比如: `php [ 'amount' => 'integer', 'price' => 'float', 'is_active' => 'boolean', 'date' => function ($value) { return ($value instanceof \DateTime) ? $value->getTimestamp(): (int)$value; }, ] ` 如果没有设置 $attributeTypes,属性类型映射将会根据属主组件的验证规则自动组装。 yii\behaviors\AttributeTypecastBehavior
$owner yii\base\Model|yii\db\BaseActiveRecord 行为的属主。 yii\behaviors\AttributeTypecastBehavior
$skipOnNull boolean 是否跳过 null 值的类型转换。 如果开启,属性值等于 null 时将不会执行类型转换(也就是说 null 还保持为 null ); 如果不开启,他将根据 $attributeTypes 里的类型配置执行转换。 yii\behaviors\AttributeTypecastBehavior
$typecastAfterFind boolean 是否在从数据库获取到属主模型数据之后, 执行类型转换(获取模型或模型刷新)。 为了追求较好的性能该选项可以设置为 false。 比如,在使用 yii\db\ActiveRecord 的时候,获取模型数据之后执行类型转换大多数情况下没什么意义, 因此可以设置为 false。 注意,在该行为已经附加到属主模型之后再调整该选项的值不会起作用。 yii\behaviors\AttributeTypecastBehavior
$typecastAfterSave boolean 是否在保存属主模型之后执行类型转换(插入或更新)。 为了追求较好的性能该选项可以设置为 false。 比如,在使用 yii\db\ActiveRecord 的时候,在保存之后执行类型转换没什么意义, 因此可以设置为 false。 注意,在该行为已经附加到属主模型之后再调整该选项的值不会起作用。 yii\behaviors\AttributeTypecastBehavior
$typecastAfterValidate boolean 是否在通过属主模型验证之后执行类型转换。 注意,类型转换只有在模型验证成功之后才执行。 也就是说,属主模型没有验证出错。 注意,在该行为已经附加到属主模型之后再调整该选项的值不会起作用。 yii\behaviors\AttributeTypecastBehavior
$typecastBeforeSave boolean 是否在保存属主模型之前执行类型转换(插入或更新)。 为了追求较好的性能该选项可以设置为 false。 比如,在使用 yii\db\ActiveRecord 的时候,在保存之前执行类型转换没什么意义, 因此可以设置为 false。 注意,在该行为已经附加到属主模型之后再调整该选项的值不会起作用。 yii\behaviors\AttributeTypecastBehavior

公共方法

隐藏继承的方法

方法描述被定义在
__call() Calls the named method which is not a class method. yii\base\BaseObject
__construct() Constructor. yii\base\BaseObject
__get() Returns the value of an object property. yii\base\BaseObject
__isset() Checks if a property is set, i.e. defined and not null. yii\base\BaseObject
__set() Sets value of an object property. yii\base\BaseObject
__unset() Sets an object property to null. yii\base\BaseObject
afterFind() 响应属主 'afterFind' 事件的方法,确保属性的类型转换。 yii\behaviors\AttributeTypecastBehavior
afterSave() 响应属主 'afterInsert' 和 'afterUpdate' 事件的方法,确保属性的类型转换。 yii\behaviors\AttributeTypecastBehavior
afterValidate() 响应属主 'afterValidate' 事件的方法,确保属性的类型转换。 yii\behaviors\AttributeTypecastBehavior
attach() Attaches the behavior object to the component. yii\behaviors\AttributeTypecastBehavior
beforeSave() 响应属主 'beforeInsert' 和 'beforeUpdate' 事件的方法,确保属性的类型转换。 yii\behaviors\AttributeTypecastBehavior
canGetProperty() Returns a value indicating whether a property can be read. yii\base\BaseObject
canSetProperty() Returns a value indicating whether a property can be set. yii\base\BaseObject
className() Returns the fully qualified name of this class. yii\base\BaseObject
clearAutoDetectedAttributeTypes() 针对所有的属主类, 清除自动检测 $attributeTypes 时的内部静态缓存值 yii\behaviors\AttributeTypecastBehavior
detach() Detaches the behavior object from the component. yii\base\Behavior
events() Declares event handlers for the $owner's events. yii\behaviors\AttributeTypecastBehavior
hasMethod() Returns a value indicating whether a method is defined. yii\base\BaseObject
hasProperty() Returns a value indicating whether a property is defined. yii\base\BaseObject
init() Initializes the object. yii\base\BaseObject
typecastAttributes() 根据 $attributeTypes 执行属主属性的类型转换。 yii\behaviors\AttributeTypecastBehavior

受保护的方法

隐藏继承的方法

方法描述被定义在
detectAttributeTypes() 从属主模型的验证规则里组装 $attributeTypes 留空时的默认值。 yii\behaviors\AttributeTypecastBehavior
typecastValue() 把指定的值转换为指定的数据类型。 yii\behaviors\AttributeTypecastBehavior

常量

隐藏继承的常量

常量描述被定义在
TYPE_BOOLEAN 'boolean' yii\behaviors\AttributeTypecastBehavior
TYPE_FLOAT 'float' yii\behaviors\AttributeTypecastBehavior
TYPE_INTEGER 'integer' yii\behaviors\AttributeTypecastBehavior
TYPE_STRING 'string' yii\behaviors\AttributeTypecastBehavior

属性详情

$attributeTypes 公共 属性

属性进行类型转换的格式:attributeName => type。 Type 可以是一个 PHP 匿名函数, 它接收属性的原始值作为参数并且应该返回类型转换的结果。 比如:

[
    'amount' => 'integer',
    'price' => 'float',
    'is_active' => 'boolean',
    'date' => function ($value) {
        return ($value instanceof \DateTime) ? $value->getTimestamp(): (int)$value;
    },
]

如果没有设置 $attributeTypes,属性类型映射将会根据属主组件的验证规则自动组装。

public array $attributeTypes null
$owner 公共 属性

行为的属主。

$skipOnNull 公共 属性

是否跳过 null 值的类型转换。 如果开启,属性值等于 null 时将不会执行类型转换(也就是说 null 还保持为 null ); 如果不开启,他将根据 $attributeTypes 里的类型配置执行转换。

public boolean $skipOnNull true
$typecastAfterFind 公共 属性

是否在从数据库获取到属主模型数据之后, 执行类型转换(获取模型或模型刷新)。 为了追求较好的性能该选项可以设置为 false。 比如,在使用 yii\db\ActiveRecord 的时候,获取模型数据之后执行类型转换大多数情况下没什么意义, 因此可以设置为 false。 注意,在该行为已经附加到属主模型之后再调整该选项的值不会起作用。

public boolean $typecastAfterFind false
$typecastAfterSave 公共 属性 (自版本 2.0.14 可用)

是否在保存属主模型之后执行类型转换(插入或更新)。 为了追求较好的性能该选项可以设置为 false。 比如,在使用 yii\db\ActiveRecord 的时候,在保存之后执行类型转换没什么意义, 因此可以设置为 false。 注意,在该行为已经附加到属主模型之后再调整该选项的值不会起作用。

public boolean $typecastAfterSave false
$typecastAfterValidate 公共 属性

是否在通过属主模型验证之后执行类型转换。 注意,类型转换只有在模型验证成功之后才执行。 也就是说,属主模型没有验证出错。 注意,在该行为已经附加到属主模型之后再调整该选项的值不会起作用。

$typecastBeforeSave 公共 属性

是否在保存属主模型之前执行类型转换(插入或更新)。 为了追求较好的性能该选项可以设置为 false。 比如,在使用 yii\db\ActiveRecord 的时候,在保存之前执行类型转换没什么意义, 因此可以设置为 false。 注意,在该行为已经附加到属主模型之后再调整该选项的值不会起作用。

方法详情

afterFind() 公共 方法

响应属主 'afterFind' 事件的方法,确保属性的类型转换。

public void afterFind($event)
$event yii\base\Event

事件对象。

afterSave() 公共 方法 (自版本 2.0.14 可用)

响应属主 'afterInsert' 和 'afterUpdate' 事件的方法,确保属性的类型转换。

public void afterSave($event)
$event yii\base\Event

事件对象。

afterValidate() 公共 方法

响应属主 'afterValidate' 事件的方法,确保属性的类型转换。

public void afterValidate($event)
$event yii\base\Event

事件对象。

attach() 公共 方法

Attaches the behavior object to the component.

The default implementation will set the $owner property and attach event handlers as declared in events(). Make sure you call the parent implementation if you override this method.

public void attach($owner)
$owner yii\base\Component

The component that this behavior is to be attached to.

beforeSave() 公共 方法

响应属主 'beforeInsert' 和 'beforeUpdate' 事件的方法,确保属性的类型转换。

public void beforeSave($event)
$event yii\base\Event

事件对象。

clearAutoDetectedAttributeTypes() 公共 静态 方法

针对所有的属主类, 清除自动检测 $attributeTypes 时的内部静态缓存值

public static void clearAutoDetectedAttributeTypes()
detectAttributeTypes() 受保护 方法

从属主模型的验证规则里组装 $attributeTypes 留空时的默认值。

protected array detectAttributeTypes()
return array

属性类型映射。

events() 公共 方法

Declares event handlers for the $owner's events.

Child classes may override this method to declare what PHP callbacks should be attached to the events of the $owner component.

The callbacks will be attached to the $owner's events when the behavior is attached to the owner; and they will be detached from the events when the behavior is detached from the component.

The callbacks can be any of the following:

  • method in this behavior: 'handleClick', equivalent to [$this, 'handleClick']
  • object method: [$object, 'handleClick']
  • static method: ['Page', 'handleClick']
  • anonymous function: function ($event) { ... }

The following is an example:

[
    Model::EVENT_BEFORE_VALIDATE => 'myBeforeValidate',
    Model::EVENT_AFTER_VALIDATE => 'myAfterValidate',
]
public array events()
return array

Events (array keys) and the corresponding event handler methods (array values).

typecastAttributes() 公共 方法

根据 $attributeTypes 执行属主属性的类型转换。

public void typecastAttributes($attributeNames null)
$attributeNames array

给出想要执行类型转换的属性名列表。 如果这个参数为空, 那么列在 $attributeTypes 之内的任何一个属性都执行类型转换。

typecastValue() 受保护 方法

把指定的值转换为指定的数据类型。

protected mixed typecastValue($value, $type)
$value mixed

将有执行类型转换的值。

$type string|callable

类型名或者能够执行类型转换的匿名函数。

return mixed

类型转换后的结果。