Yii2 attributeLabels()

时间:2015-05-07 13:33:23

标签: php yii2 yii2-advanced-app

我有一个带有此功能的ActiveRecord模型用于属性标签:

public function attributeLabels() { 

        return  [
            'start_date' => Text::getText('model_group_StartDate'),
            // and many more texts ....
        ];
}

现在我的问题是,当我使用ActiveForm并让Yii自动加载标签时会产生太多的sql查询,因为每次加载标签时它会调用attributeLabels()并减慢我的页面。

我必须从数据库加载属性标签。

我知道我可以通过label()在ActiveForm中设置自己的标签,但我更喜欢在我的模型中使用它,因为我必须在不同的地方使用标签。

我很高兴任何提示如何只加载一次属性标签。

1 个答案:

答案 0 :(得分:3)

每次请求单个属性标签时,Yii确实会调用您的函数attributeLabels()(因此执行Text::getText())。

您可以通过在级别缓存生成的属性标签来解决此问题,这意味着每个请求的{class,attribute}的每个组合只需要生成一次标签。如果您有一个所有ActiveRecord类扩展的公共类,您可以使用以下代码一劳永逸地解决它:

class ActiveRecord extends \yii\db\ActiveRecord {
    private static $getAttributeLabelCache;

    public function getAttributeLabel($attribute)
    {
        $class = get_class($this);

        if (!isset(self::$getAttributeLabelCache[$class][$attribute])) {
            self::$getAttributeLabelCache[$class][$attribute] = parent::getAttributeLabel($attribute);
        }

        return self::$getAttributeLabelCache[$class][$attribute];
    }
}

有点相关:https://github.com/laszlovl/yii2-staticactiverecord