flaviovs/yii2-data-transformation

为Yii2模型提供数据转换行为

安装量6,279

依赖项: 0

建议者: 0

安全: 0

星星: 0

关注者: 2

分支: 0

公开问题: 0

类型:yii2-extension

0.0.1 2019-01-18 20:39 UTC

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
*/

支持

访问https://github.com/flaviovs/yii2-data-transformation