php - Yii2。动态添加属性和规则到模型

标签 php yii 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”,所以我想避免这种情况。还有其他想法吗?如何在不扩展模型的情况下做到这一点?

最佳答案

向现有模型添加动态属性

当您想在运行时向现有模型添加动态属性时。然后您需要一些自定义代码,您需要:一个模型类和一个扩展类,它将执行动态部分并具有用于保存动态信息的数组。这些数组将在所需的函数中与模型类的返回数组合并。

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

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);
}
}

全动态属性

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

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

这是完整的 example with form integration来自Yii2-Wiki,这里就不举例了。

虚拟属性

当你想给模型添加一个不在数据库中的属性时。然后只需在模型中声明一个公共(public)变量:

public $myVirtualAttribute;

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

待办事项Massive Assignment不要忘记在模型规则中添加安全规则:

public function rules()
{
    return [
        ...,
        [['myVirtualAttribute'], 'safe'],
        ...
    ];
}

这里很好地解释了这样做的原因: Yii2 non-DB (or virtual) attribute isn't populated during massive assignment?

关于php - Yii2。动态添加属性和规则到模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38356701/

相关文章:

string - Yii2 中 Null 到空字符串

php - 在字符串中包含单引号

yii 创建一个没有 Assets 的干净应用程序

php - Yii2 - JSONP 响应不返回任何内容(空白)并且不起作用,但 JSON 可以

php - Yii2-SQLSTATE[42000] : Syntax error or access violation: 1064 on insert batch

php - 我被要求修复搜索功能中的错误。我在 yii 上不断收到 CDbException

php - 使用 AJAX 和 PHP 将 <options> 附加到 <select>

php - Wordpress - 按下按钮时打开弹出窗口

php - 开发一个网站所需的所有组件?

php - Yii + mysql + cloudControlled