Метки атрибутов Yii2 ()

У меня есть модель ActiveRecord с этой функцией для меток атрибутов:

public function attributeLabels() { 

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

Теперь моя проблема заключается в том, что когда я использую ActiveForm и позволяю Yii автоматически загружать метки, он создает слишком много запросов sql, потому что каждый раз, когда он загружает метку, он вызывает attributeLabels() и замедляет мою страницу.

Мне нужно загрузить метки атрибутов из базы данных.

Я знаю, что могу установить собственные метки в ActiveForm через label(), но я предпочитаю иметь их в своей модели, потому что мне приходится использовать метки в разных местах.

Я рад любым подсказкам, как загружать метки атрибутов только один раз.


person Sarah West    schedule 07.05.2015    source источник
comment
Если для локализации тоже ничего нет, вы хотели бы как-то использовать кеширование. Вы читали этот документ о кэшировании? особ. про мемкэш...   -  person robsch    schedule 07.05.2015
comment
вы можете определить статический массив меток в методе attributeLabels() и проверить его. Если он пуст: инициализируйте его метками атрибутов из базы данных, иначе просто верните его.   -  person Tony    schedule 07.05.2015
comment
также можете ли вы рассказать нам, что на самом деле делает Text::getText() ?   -  person Tony    schedule 07.05.2015
comment
Text::getText() извлекает текст из базы данных   -  person Sarah West    schedule 08.05.2015


Ответы (1)


Yii действительно будет вызывать вашу функцию attributeLabels() (и, таким образом, выполнять Text::getText()) каждый раз, когда запрашивается отдельная метка атрибута.

Вы можете решить эту проблему, кэшируя сгенерированные метки атрибутов на уровне класса, что означает, что метку нужно будет сгенерировать только один раз для каждой комбинации {класс, атрибут} для каждого запроса. Если у вас есть общий класс, от которого расширяются все ваши классы 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

person laszlovl    schedule 07.05.2015
comment
Спасибо! Это работает и уменьшает количество запросов к базе данных. - person Sarah West; 08.05.2015