chemezov / yii2-dynamic-fields
为 Yii2 框架提供与自定义(动态)字段交互的行为
2.0
2022-05-20 17:40 UTC
Requires
- yiisoft/yii2: *
This package is auto-updated.
Last update: 2024-09-20 22:43:18 UTC
README
为 Yii2 框架提供与自定义(动态)字段交互的行为。
安装
安装此扩展的最佳方式是通过 composer。
运行以下命令
php composer.phar require --prefer-dist chemezov/yii2-dynamic-fields "*"
或在您的 composer.json 文件的 require 部分添加以下内容
"chemezov/yii2-dynamic-fields": "*"
应用迁移
yii migrate --migrationPath=@vendor/chemezov/yii2-dynamic-fields/migrations
用法
use chemezov\yii2_dynamic_fields\DynamicFieldsBehavior; class User extends \yii\db\ActiveRecord { public function behaviors() { return [ 'dynamicFields' => [ 'class' => DynamicFieldsBehavior::class, 'fields' => ['my_custom_string_1', 'my_custom_string_2'], ], ]; } public function rules() { return [ [['my_custom_string_1', 'my_custom_string_2'], 'string', 'max' => 255], ]; } public function attributeLabels() { return [ 'my_custom_string_1' => 'My string 1', 'my_custom_string_2' => 'My string 2', ]; } }
现在您可以使用自定义属性了
$model = new User(); $value = $model->my_custom_string_1; // get value $model->my_custom_string_1 = 'some value'; // set value $model->save();
其他类型
如果您想使用字符串以外的其他类型,可以使用 AttributeTypecastBehavior。在 DynamicFieldsBehavior 之后添加 AttributeTypecastBehavior。 请注意!
use chemezov\yii2_dynamic_fields\DynamicFieldsBehavior; use yii\behaviors\AttributeTypecastBehavior; class User extends \yii\db\ActiveRecord { public function behaviors() { return [ 'dynamicFields' => [ 'class' => DynamicFieldsBehavior::class, 'fields' => ['my_boolean_attribute'], ], 'typecast' => [ 'class' => AttributeTypecastBehavior::class, 'attributeTypes' => [ 'my_boolean_attribute' => AttributeTypecastBehavior::TYPE_BOOLEAN, ], 'typecastAfterFind' => true, ], ]; } public function rules() { return [ [['my_boolean_attribute'], 'default', 'value' => null], [['my_boolean_attribute'], 'boolean'], ]; } public function attributeLabels() { return [ 'my_boolean_attribute' => 'My boolean attribute', ]; } }
示例
例如,您有一个用户模型。您想要存储地址和其他值,例如 is_client,但不想扩展您的数据库表。因此,您可以使用此行为。以下是一个用户模型的示例
use chemezov\yii2_dynamic_fields\DynamicFieldsBehavior; use yii\behaviors\AttributeTypecastBehavior; /** * Class User * * @property string $address * @property boolean $is_client */ class User extends \yii\db\ActiveRecord { public function rules() { return [ ... [$this->getAdditionalFieldsNamesString(), 'string', 'max' => 255], [$this->getAdditionalFieldsNamesBoolean(), 'default', 'value' => null], [$this->getAdditionalFieldsNamesBoolean(), 'boolean'], ]; } public function behaviors() { return [ 'dynamicFields' => [ 'class' => DynamicFieldsBehavior::class, 'fields' => $this->getAdditionalFieldsNames(), ], 'typecast' => [ 'class' => AttributeTypecastBehavior::class, 'attributeTypes' => [ 'is_client' => AttributeTypecastBehavior::TYPE_BOOLEAN, ], 'typecastAfterFind' => true, ], ]; } public function getAdditionalFieldsNamesString() { return [ 'address', ]; } public function getAdditionalFieldsNamesBoolean() { return [ 'is_client', ]; } public function getAdditionalFieldsNames() { return array_merge($this->getAdditionalFieldsNamesString(), $this->getAdditionalFieldsNamesBoolean()); } public function fields() { return array_merge(parent::fields(), $this->getAdditionalFieldsNames()); } }
JsonDynamicFieldsBehavior 的用法
使用此行为与使用 DynamicFieldsBehavior 类似。此行为将动态字段存储在模型表的不同列中,格式为 json。
您应该在您的模型表中创建一个列,例如 additional_data,类型为 text,并允许 null 值。迁移示例
$this->addColumn('your_table', 'additional_data', $this->text()->null());
use chemezov\yii2_dynamic_fields\JsonDynamicFieldsBehavior; use yii\behaviors\AttributeTypecastBehavior; class User extends \yii\db\ActiveRecord { public function behaviors() { return [ 'dynamicFields' => [ 'class' => JsonDynamicFieldsBehavior::class, 'fields' => ['my_boolean_attribute'], ], 'typecast' => [ 'class' => AttributeTypecastBehavior::class, 'attributeTypes' => [ 'my_boolean_attribute' => AttributeTypecastBehavior::TYPE_BOOLEAN, ], 'typecastAfterFind' => true, ], ]; } public function rules() { return [ [['my_boolean_attribute'], 'default', 'value' => null], [['my_boolean_attribute'], 'boolean'], ]; } public function attributeLabels() { return [ 'my_boolean_attribute' => 'My boolean attribute', ]; } }