2013-08-06 29 views
1

通常,最佳做法是僅從控制器調用模型,然後將其傳遞給視圖。這裏有一個例子:yii中的片段緩存:我應該在哪加載我的模型?

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查詢要被執行。我怎樣才能防止這種情況發生?

我現在發現的唯一選擇是從視圖(在緩存部分)加載模型或執行數據緩存,但我寧願使用片段緩存!

+3

對於你的建議有不同的意見,你不應該從視圖訪問模型。雖然這對於*寫作*來說絕對是正確的,但對模型的讀取權限在視圖中可以完美無缺。所以我不會盲目地遵循MVC的「良好實踐」,如果有充分的理由,不這樣做。例如,在這種情況下,我本人會例外。 –

+0

謝謝!另一種解決方案是在調用模型的控制器中創建一個新方法,並從視圖中調用這個新方法。但最後,就像從視圖中調用模型一樣! – darkheir

回答

0

你應該將緩存到控制器,並使用data cache而不是片段緩存,即:

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與某事。

+0

是的,但是MichaelHärtl說的也是對的 – darkheir

+0

沒錯,但可能在你的'loadModel'中你也有一些加載邏輯,比如404找不到,所以你不會得到'null'而不是model實例。但是,你也可以使'loadModel'公開,並從視圖中訪問它:'$ model = $ this-> loadModel();' – 2013-08-07 08:49:46

相關問題