2013-11-24 75 views
0

在我的一個extbase模型中,我想初始化從保存在數據庫中的屬性派生的一些屬性。這些虛擬屬性的計算非常耗時,所以我想緩存它們。因此,我的程序流程應該以某種方式是這樣的:在extbase域模型中初始化後

  1. 負載域對象像往常一樣從數據庫
  2. 檢查虛擬財產是在高速緩存中可用。如果是這樣,請從那裏獲取它,否則計算並緩存它。

我首先想到的方法「initializeObject」是我需要的,但它不是:它在任何屬性從數據庫初始化之前調用。所以,我想出了另外兩種方式:

  1. 我可以手動從庫中提取對象之後調用初始化法,但似乎不可思議,如果有人又增加了find*方法一般存儲庫將打破。
  2. 另一個想法是向模型添加一個布爾型「virtualPropertiesInitialized」,每當訪問其中一個虛擬屬性時進行查詢,並在需要時初始化虛擬屬性。也似乎很奇怪,但不會因爲有人向通用存儲庫添加另一個「查找」方法而中斷。

我的問題是:

是否有缺省的/最佳實踐如何做我想做的事?

回答

1

如果從磁盤或數據庫讀取最終值的計算量較小,則可以使用TYPO3 caching framework或通過您自己的靜態類的緩存方法存儲該值,並將其恢復到虛擬屬性的getter中。在getter方法public mixed getYourPropery()中執行此操作將爲您提供在您調用該值時僅從緩存中獲取值的功能。

在第二個電話,只是回你以前存儲的值:

private $myValue = NULL; 

public function getMyValue() { 
    if($this->myValue != NULL) return $this->myValue; 

    $this->myValue = "test"; 
    return $this->myValue; 
} 
+0

這是對我提出如上(旗),第二個解決方案同樣的事情。需要該標誌來防止緩存框架在每次查詢緩存狀態時生成SQL查詢,這會導致每頁渲染出現許多SQL查詢。我認爲我現在就會放棄它,除非指出我更好的方式。 – Jost

+0

而不是定義像''virtualPropertiesInitialized''這樣的屬性,我會添加一個保存該值的成員變量。如果此值爲空,則從緩存中獲取,否則返回持有者。我會將此附加到我的答案。 – Merec

+0

這是一個很好的方式來重新使用屬性作爲標誌,但不會在我的情況下工作:該屬性可能是'null'。 – Jost