flaviovs / yii2-data-transformation
为Yii2模型提供数据转换行为
Requires
- php: >=5.6.0
Requires (Dev)
- codeception/codeception: ^2.4
- yiisoft/yii2: ~2.0.0
This package is auto-updated.
Last update: 2024-09-19 10:41:44 UTC
README
此扩展提供了一个行为,使得在Yii2模型中添加数据转换属性变得简单。它通过创建虚拟属性来实现,这些属性在设置/获取操作中自动进行数据转换。
常见用例
-
您在数据库中使用Unix时间戳和/或日期字符串存储日期,但希望将它们作为DateTime对象进行操作
-
自动数据序列化
-
计算属性
有关此扩展如何帮助您解决问题的更多信息,请参阅ActiveRecord文档中的数据转换部分。
安装
composer require flaviovs/yii2-data-transformation
如何使用
此扩展提供了一个抽象
类,您可以使用它来创建数据转换属性。换句话说,您需要定义自己的行为类以执行所需的转换
(或寻找其他人创建的一个)。
要创建数据转换类,从\fv\yii\behaviors\DataTransformation
扩展,并添加以下方法
-
transform($value)
(必需)- 将数据转换应用于原始模型值$value
(例如,Unix时间戳)并返回转换后的结果(例如,一个\DateTimeImmutable
)。 -
transformBack($value)
(可选)- 将数据转换应用于转换后的值$value
(例如,一个\DateTimeImmutable
)并返回原始模型的表示形式(例如,Unix时间戳)。此方法为可选,继承的实现只是将$value
转换为字符串
。
NULL处理
默认情况下,数据转换方法不会接收null
值 —— fv\yii\behaviors\DataTransformation
将自动拦截它们,并自动返回null
。您可以通过在您的类中将$autoConvertNull
设置为false
来更改此行为(在这种情况下,当然,您的转换方法必须准备好处理null
值)。
例如
class MyBehavior extends \fv\yii\behaviors\DataTransformation { public $autoConvertNull = false; // (...) }
模型使用
当将数据转换行为添加到模型时,您应该在配置数组中的attributes
键中指定要转换的属性。属性必须指定为键/值对,其中键是转换的(虚拟)属性,而值是原始属性。
示例
自动日期转换
此行为将允许访问基于Unix时间戳的属性
class DateTimeImmutableBehavior extends \fv\yii\behaviors\DataTransformation { protected function transform($value) { return new \DateTimeImmutable('@' . $value); } protected function transformBack($value) { return $value->getTimestamp(); } }
现在在您的模型中
class MyModel extends \yii\base\Model { /** * Unix timestamp attributes. * * @var integer */ public $created; public $updated; function behaviors() { return [ 'datetime' => [ 'class' => \app\behaviors\DateTimeImmutableBehavior::class, 'attributes' => [ 'createdDateTime' => 'created', 'updatedDateTime' => 'updated', ], ], ]; } }
在您的代码中
// Print our timestamp property. print_r($mymodel->created); /* 1547346253 */ // Print our data transformation property. echo $mymodel->createdDateTime; /* DateTimeImmutable Object ( [date] => 2019-01-13 02:24:13.000000 [timezone_type] => 1 [timezone] => +00:00 ) */ // Set value using date transformation. $mymodel->updatedDateTime = new DateTime('2018-12-01 00:00:00'); // Output transformed value. echo $mymodel->updated; /* 1543651200 */