Я получаю объект модели 3 раза (Yii2) для загрузки контроллера view. Из-за этого моя страница загружается медленно. Как его уменьшить?
public function behaviors()
{
return [
'httpCache' => [
'class' => 'yii\filters\HttpCache',
'only' => ['view'],
'lastModified' => function ($action, $params) {
$post = $this->findModel(Yii::$app->request->get('id'));
return strtotime($post->updated);
},
'etagSeed' => function ($action, $params) {
$post = $this->findModel(Yii::$app->request->get('id'));
return serialize([$post->updated, $post->views, $post->comments, Yii::$app->user->isGuest ? 0 : 1]);
}
],
];
}
public function actionView($id)
{
$model = $this->findModel($id);
return $this->render('view', [
'model' => $model,
]);
}






Вы можете кэшировать экземпляр модели на уровне контроллера:
private $_models = [];
protected function findModel($id) {
if (!array_key_exists($id, $this->_models)) {
$this->_models[$id] = MyModel::findOne($id);
if ($this->_models[$id] === null) {
$this->notFound();
}
}
return $this->_models[$id];
}
Только первый вызов findModel() будет запрашивать БД, следующие вызовы вернут уже созданный объект.
Кэширование на уровне модели сложно. Иногда вам нужно запросить свежую модель из БД вместо кеша. И такое кеширование может увеличить потребление памяти, если вы будете использовать несколько моделей в одном запросе. Такие случаи легче обрабатывать на уровне контроллера, когда вы знаете, что вам всегда будет нужна одна модель, и вам не нужно запрашивать ее снова.
Хорошая попытка, спасибо. Было бы лучше поставить модель кеша или было бы сложнее?