2012-04-11 53 views
2

有人可以解釋爲什麼在MVC框架中需要註冊表類嗎?什麼是註冊表類的目的?

它是否加載庫?什麼是創建註冊表背後的一般想法?什麼數據應該由註冊表處理?

回答

2

直接從http://www.phppatterns.com/docs/design/the_registry

註冊表提供了一個很好的管理方式在全球存儲數據,幫助防止全球危機的機制。

基本上,它意味着註冊表是一個地方,您可以在全局範圍內存儲您需要的變量/對象,而不會污染應用程序的全局名稱空間。它本身與MVC無關,但許多MVC框架也使用註冊表模式。

它可以讓你一個變量在一個地方,檢索它在另一個地方,而不必訴諸於各種複雜的程序或魔法的檢索您的變量。

以Zend Framework爲例,創建一個Zend_Navigation對象並將其存儲在Zend_Registry的引導程序中。稍後,您可以輕鬆地從註冊表中的控制器或其他類中的一箇中檢索它。

+0

因此註冊表需要靜態調用?或通過一個對象? – Eli 2012-04-11 07:19:54

+0

大多數註冊表實現都是靜態的。例如,Zend_Registry :: get()和Zend_Registry :: set()。 – ChrisR 2012-04-11 07:23:16

+0

不要僅僅因爲Zend使用靜態註冊表,Zend甚至不接近成爲良好開發標準的支柱。相反,將狀態傳遞給你的MVC對象。這允許您在單個執行中使用多個註冊表(或狀態對象)。另外,沒有靜態測試可以更好地處理。 – kingmaple 2012-04-11 07:49:37

0

Registry Class更像是數據持有者對象加載器等。您可以將數據添加到控制器中的註冊表並從視圖中獲取它。 一個小例子。

Class Registry 
    { 
     protected $data = array(); 
     private $loadClasses; 

     public function getData($name){ 

      return isset($this->data[$name])?$this->data[$name]:null; 
     } 
     public function setData($name,$value) 
     { 
      $this->data[$name] = $value; 
     } 
     public function addData($name,$value) 
     { 
      $this->data[$name][] = $value; 
     } 


     public function &singletonLoad($class) 
     { 
      if(isset($this->loadClasses[$class])) 
      { 
       return $this->loadClasses[$class] ; 
      } 
      if(class_exists($class)) 
      { 
       return $this->loadClasses[$class] = new $class(); 
      }else 
      { 
       return false; 
      } 
     } 



    } 


    class AController extends Controller 
    { 
     public function indexAction() 
     { 
      $this->registsry->setData('name','John') ; 
     } 

    } 


    class AView extends View 
    { 
     public function getName() 
     { 
      return $this->registsry->getData('name') ; 
     } 

    }