2010-04-14 4 views
3

Zend_Db_Table 모델 인스턴스화 할 때 자신이 수행 한 작업 '캐시'내 코드에서이 일을 발견 :젠드 프레임 워크 - 데이터베이스 테이블 싱글

if (Zend_Registry::isRegistered('x_table')) { 
    $x_table = Zend_Registry::get('x_table'); 
} else { 
    $x_table = new Default_Model_DbTable_X; 
    Zend_Registry::set('x_table', $x_table); 
} 

그것은 나를 귀찮게이 방법은 매우 DRY 아니라고과 그것은 나에게 오늘 싱글 톤 패턴이 더 나은 방법 일 것이라고 밝혀졌다. 문제는, 싱글 톤 클래스를 작성한 적이 없다는 것입니다. 내가 웹 검색을했을 때, Zend_Db_Table 싱글 톤에 대한 약간의 논평을 발견했지만 실제 예는 없습니다.

이미 메타 데이터 캐싱이 구성되어 있습니다.

  1. Zend_Db_Table 모델을 싱글 톤으로 만들려면 어떻게해야합니까?
  2. 함정이나 단점이 있습니까?

편집 : 싱글 생각에 대한 나의 이유는 대답은 내가 단순히 내 코드 $x_table = new Default_Model_DbTable_X;에서 다음 통화를 할 수 있으며이 존재한다면 하나의 인스턴스가 반환 될 것이라고 생각한다는 것입니다이었다. 이것이 가능하다면 나는 그 해결책을 선호 할 것이다.

+1

동일한 요청에서 같은 테이블의 인스턴스를 여러 개 인스턴스화해야하는 코드에서 수행중인 작업은 무엇입니까? – Gordon

+2

* (참조) * http://sourcemaking.com/design_patterns/singleton – Gordon

+0

CMS를 작성 중이며 테이블에 내용이 들어 있습니다. 콘텐츠 블록은 페이지에 넣을 수 있으며 페이지에는 동일한 유형의 블록이 두 개 이상있을 수 있습니다. 참조 주셔서 감사합니다! – Sonny

답변

3

왜 현명한 장소에서 Db 테이블을 관리하지 않는 것이 좋을까요? 적절한 위치가 없으면 DbTableManager 클래스를 만듭니다. 예 :

<?PHP 
class DbTableMgr { 

    protected $_tables; 

    public function getTable($classname){ 
    if (empty($this->_tables[$name])){ 
     //assuming some things about class names for the sake of brevity elsewhere... 
     $classname = 'Default_Model_DbTable_',ucfirst(strtolower($classname)); 

     $this->_tables[$name] = new $classname; 
    } 
    return $this->_tables[$name]; 
    } 
} 

부트 스트랩에서 관리자를 초기화하고 레지스트리에 고정하십시오. 그런 다음

:

<?PHP 
//in a galaxy far, far, away 
$dbtFoo = Zend_Registry::get('dbtMgr')->getTable('Foo'); 

그래서, 당신은 DBTABLE 객체를 게으른 -로드 및 싱글 같은 동작을 적용합니다.

원한다면 위의 여러 가지 방법으로 정적으로 만들 수 있습니다.

+0

당신의'Zend_Registry' 메소드는 좋아 보이지만, 당신이 "합리적인 곳"을 의미하는 것에 흥미가 있습니다. 'Zend_Registry'가 차선책이라고 암시하는 것 같습니다. – Sonny

+0

Zend_Registry는 이런 종류의 문제가 없습니다. 방금 애플리케이션 설계에 따라 dbTableManager를 구현하는 데 더 합리적인 곳이 있음을 의미했습니다. 그러나 확실하지 않다면, 내가 보여준 클래스를 만드는 것만으로는 문제가되지 않으며, 데이터베이스에 부트 스트랩하는 동안 레지스트리에 고정시켜야합니다. – timdev

+0

오케이 이것은 오래된 질문이지만 호기심이 많습니다. 왜 그냥 싸구려로 만들지 않아? 그렇지 않으면 그것은 convinience를 추가합니다. –