php动态添加属性,php – Yii2.动态添加属性和规则到模型

我正在编写一个小部件,我想避免用户在他们的模型中添加代码(我知道它会更容易但是用它来学习新的东西).

您是否知道是否可以向模型添加属性(不在数据库中,因此它将是虚拟的)并为该属性添加规则?您无权更改该型号代码.

我知道规则是一个数组.在过去,我使用array_merge从父类合并了规则.可以在外部完成吗? Yii2有一个方法吗?

一个想法是扩展用户提供的模型,在我的小部件中使用“模型”,并使用:

public function init() {

/*Since it is extended this not even would be necessary,

I could declare the attribute as usual*/

$attribute = "categories";

$this->{$attribute} = null; //To create attribute on the fly

parent::init();

}

public function rules() {

$rules = [...];

//Then here merge parent rules with mine.

return array_merge(parent::rules, $rules);

}

但是,如果我扩展它,当我在一个复选框的示例中使用ActiveForm中的模型时,它将使用我的“CustomModel”,所以我想避免这种情况.还有其他想法吗?如何在不扩展模型的情况下做到这一点?

最佳答案:

将动态属性添加到现有模型

如果要在运行时将动态属性添加到现有模型中.然后你需要一些自定义代码,你需要:一个Model-Class和一个扩展类,它将执行动态部分并且具有保存动态信息的数组.这些数组将在所需函数中与Model-Class的返回数组合并.

这是一种模型,它没有完全发挥作用.但也许你知道你需要做什么:

class MyDynamicModel extends MyNoneDynamicModel

{

private $dynamicFields = [];

private $dynamicRules = [];

public function setDynamicFields($aryDynamics) {

$this->dynamicFields = $aryDynamics;

}

public function setDynamicRules($aryDynamics) {

$this->dynamicRules = $aryDynamics;

}

public function __get($name)

{

if (isset($this->dynamicFields[$name])) {

return $this->dynamicFields[$name];

}

return parent::__get($name);

}

public function __set($name, $value)

{

if (isset($this->dynamicFields[$name])) {

return $this->dynamicFields[$name] = $value;

}

return parent::__set($name, $value);

}

public function rules() {

return array_merge(parent::rules, $this->dynamicRules);

}

}

完整的动态属性

当所有属性都是动态的并且您不需要数据库时.然后使用Yii2的新DynamicModel.该文件还指出:

DynamicModel is a model class primarily used to support ad hoc data validation.

这是来自Yii2-Wiki的完整example with form integration,所以我不在这里举个例子.

虚拟属性

当您要向模型添加属性时,该属性不在数据库中.然后只需在模型中声明一个公共变量:

public $myVirtualAttribute;

然后,您可以在规则中使用它,就像其他(数据库)属性一样.

要做到Massive Assignment,请不要忘记为模型规则添加安全规则:

public function rules()

{

return [

...,

[['myVirtualAttribute'], 'safe'],

...

];

}

标签:php,yii,yii2

来源: https://codeday.me/bug/20190516/1115228.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值