Yii2 属性标签()

Yii2 attributeLabels()

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

public function attributeLabels() { 

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

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

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

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

对于如何仅加载一次属性标签的任何提示,我都很高兴。

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

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

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