TYPO3: производительность в модели Extbase - PullRequest
0 голосов
/ 27 августа 2018

Предположим, у меня есть модель со свойством:

/**
 * @var array
 */
protected $myProperty;

Нет поля базы данных для этого свойства, данные для этого свойства извлекаются откуда-то еще:

/**
 * @return array
 */
public function getMyProperty() {
    return getDataFromSomewhere();
}

Проблема, которую я вижу здесь, заключается в том, что если я использую это свойство более одного раза, функция вызывается несколько раз. И если эта функция извлекает данные, например, из другой таблицы с присоединениями mysql или делает какие-то обширные вычисления, это не соответствует действительности.

Каковы мои возможности здесь? Немного улучшить геттер?

/**
 * @return array
 */
public function getMyProperty() {
    if($this->myProperty === NULL) {
        $this->setMyProperty(getDataFromSomewhere());
    }
    return $this->myProperty;
}

Я знаю, что мог бы использовать Caching Framework и кэшировать значение, возвращаемое функцией "getDataFromSomewhere", но я ищу более простое решение.

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Второй вариант метода getter, который вы предлагаете, является хорошей идеей и обычно известен как «отложенная загрузка». Поле myProperty заполняется данными только при обращении к ним. С другой стороны, если метод getter никогда не вызывается, данные вообще не нужно загружать.

Вы можете выбрать другой стиль кодирования, например, используя троичные- или нулевые операторы слияния , но схема та же. Вы можете найти больше примеров вашей идеи в Интернете .

0 голосов
/ 27 августа 2018

Вы можете заставить метод get делать return $this->myProperty ?? ($this->myProperty = getDataFromSomewhere());. Затем он заполняет локальное свойство перед возвратом значения, если оно равно нулю - что, конечно, вы должны убедиться, что свойство инициализируется как.

...