Php yii中的片段缓存:我应该在哪里加载我的模型?

Php yii中的片段缓存:我应该在哪里加载我的模型?,php,caching,yii,Php,Caching,Yii,通常,良好的做法是仅从控制器调用模型,然后将其传递给视图。下面是一个例子: public function actionView($id) { $this->render('view', array( 'model' => $this->loadModel((int)$id), )); } 然后,您可以在视图中使用model来显示信息 问题是我想在我的视图中实现片段缓存: <?php if($this->beginC

通常,良好的做法是仅从控制器调用模型,然后将其传递给视图。下面是一个例子:

public function actionView($id)
{
    $this->render('view', array(
            'model' => $this->loadModel((int)$id),
        ));
}
然后,您可以在视图中使用
model
来显示信息

问题是我想在我的视图中实现片段缓存:

<?php if($this->beginCache($id, array('duration'=>3600))) { ?>
...content to be cached...
<?php $this->endCache(); } ?>

…要缓存的内容。。。
但由于模型已从控制器加载,sql查询仍将执行。我怎样才能防止这种情况发生


我现在发现的唯一替代方法是从视图(在缓存部分)加载模型或执行数据缓存,但我更喜欢使用片段缓存

您应该将缓存移动到控制器,并使用而不是片段缓存,即:

public function actionView($id)
{
    $model = Yii::app()->cache->get((int)$id);
    if($model === false)
    {
        $model = $this->loadModel((int)$id);
        Yii::app()->cache->set($id, $model, 3600);
    }
    $this->render('view', array(
            'model' => $model,
        ));
}

如果需要,您仍然可以使用片段缓存(当您对已加载的模型执行某些强化操作时),只需在id前面加上前缀即可。

对于您的建议,有不同的意见,您不应该从视图访问模型。虽然这对于编写某些东西来说是绝对正确的,但是在视图中,对模型的读取访问是非常好的。所以,如果有充分的理由,我不会盲目地遵循MVC“良好实践”。例如,在这种情况下,我个人会破例。谢谢!另一个解决方案是在调用模型的控制器中创建一个新方法,并从视图中调用这个新方法。但最后,这就像从视图中调用模型一样!没错,但是在
loadModel
中可能也有一些加载逻辑,比如404异常,当找不到时,因此不会得到
null
而不是模型实例。但是,您也可以将
loadModel
公开,并从视图中访问它:
$model=$this->loadModel()