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()代码>