Class yii\behaviors\AttributeTypecastBehavior
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 |
属性详情
属性进行类型转换的格式:attributeName => type。 Type 可以是一个 PHP 匿名函数, 它接收属性的原始值作为参数并且应该返回类型转换的结果。 比如:
[
'amount' => 'integer',
'price' => 'float',
'is_active' => 'boolean',
'date' => function ($value) {
return ($value instanceof \DateTime) ? $value->getTimestamp(): (int)$value;
},
]
如果没有设置 $attributeTypes,属性类型映射将会根据属主组件的验证规则自动组装。
行为的属主。
是否跳过 null
值的类型转换。
如果开启,属性值等于 null
时将不会执行类型转换(也就是说 null
还保持为 null
);
如果不开启,他将根据 $attributeTypes 里的类型配置执行转换。
是否在从数据库获取到属主模型数据之后, 执行类型转换(获取模型或模型刷新)。 为了追求较好的性能该选项可以设置为 false。 比如,在使用 yii\db\ActiveRecord 的时候,获取模型数据之后执行类型转换大多数情况下没什么意义, 因此可以设置为 false。 注意,在该行为已经附加到属主模型之后再调整该选项的值不会起作用。
是否在保存属主模型之后执行类型转换(插入或更新)。 为了追求较好的性能该选项可以设置为 false。 比如,在使用 yii\db\ActiveRecord 的时候,在保存之后执行类型转换没什么意义, 因此可以设置为 false。 注意,在该行为已经附加到属主模型之后再调整该选项的值不会起作用。
是否在通过属主模型验证之后执行类型转换。 注意,类型转换只有在模型验证成功之后才执行。 也就是说,属主模型没有验证出错。 注意,在该行为已经附加到属主模型之后再调整该选项的值不会起作用。
是否在保存属主模型之前执行类型转换(插入或更新)。 为了追求较好的性能该选项可以设置为 false。 比如,在使用 yii\db\ActiveRecord 的时候,在保存之前执行类型转换没什么意义, 因此可以设置为 false。 注意,在该行为已经附加到属主模型之后再调整该选项的值不会起作用。
方法详情
响应属主 'afterFind' 事件的方法,确保属性的类型转换。
public void afterFind($event) | ||
$event | yii\base\Event | 事件对象。 |
响应属主 'afterInsert' 和 'afterUpdate' 事件的方法,确保属性的类型转换。
public void afterSave($event) | ||
$event | yii\base\Event | 事件对象。 |
响应属主 'afterValidate' 事件的方法,确保属性的类型转换。
public void afterValidate($event) | ||
$event | yii\base\Event | 事件对象。 |
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. |
响应属主 'beforeInsert' 和 'beforeUpdate' 事件的方法,确保属性的类型转换。
public void beforeSave($event) | ||
$event | yii\base\Event | 事件对象。 |
针对所有的属主类, 清除自动检测 $attributeTypes 时的内部静态缓存值
public static void clearAutoDetectedAttributeTypes() |
从属主模型的验证规则里组装 $attributeTypes 留空时的默认值。
protected array detectAttributeTypes() | ||
return | array | 属性类型映射。 |
---|
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). |
---|
根据 $attributeTypes 执行属主属性的类型转换。
public void typecastAttributes($attributeNames = null) | ||
$attributeNames | array | 给出想要执行类型转换的属性名列表。 如果这个参数为空, 那么列在 $attributeTypes 之内的任何一个属性都执行类型转换。 |
把指定的值转换为指定的数据类型。
protected mixed typecastValue($value, $type) | ||
$value | mixed | 将有执行类型转换的值。 |
$type | string|callable | 类型名或者能够执行类型转换的匿名函数。 |
return | mixed | 类型转换后的结果。 |
---|