2013-11-24 1 views
0

내 extbase 모델 중 하나에서 데이터베이스에 저장된 속성에서 파생 된 일부 속성을 초기화하고 싶습니다. 이러한 가상 속성의 계산에는 많은 시간이 소요되므로 캐시를 만들고 싶습니다. 따라서 내 프로그램의 흐름은 다음과 같이 어떻게 든 찾아야한다 : 평소와 같이extbase 도메인 모델의 초기화 후

  1. 로드 도메인 오브젝트를 데이터베이스에서
  2. 확인을 가상 속성은 캐시에 사용할 수있는 경우. 그렇다면 거기에서 그것을 가져오고, 그렇지 않으면 그것을 계산하고 캐시하십시오.

내가 처음에는 "initializeObject"메서드가 필요하다고 생각했지만 그렇지 않았습니다. 데이터베이스에서 속성을 초기화하기 전에 호출되었습니다. 그래서이 두 가지를 내놓았다 : 나는 개체를 가져 오는 한 후 저장소에서 수동으로 초기화 메소드를 호출 할 수 있습니다,하지만 이상한 것 같다 누군가가 일반 저장소에 다른 find* 방법을 추가하는 경우 휴식 것이

  1. .
  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

관련 문제