2010-03-15 55 views

回答

1

從​​:

資源註冊

許多,如果不是全部,你的資源方法或者插件將初始化對象,而且在許多情況下,這些目標將會在其他地方需要用到你的申請。你如何訪問它們?

Zend_Application_Bootstrap_BootstrapAbstract爲這些對象提供本地註冊表。要將對象存儲在它們中,只需從資源中返回它們即可。

爲了獲得最大的靈活性,此註冊表在內部被稱爲「容器」它唯一的要求是它是一個對象。資源然後被註冊爲以資源名稱命名的屬性。默認情況下,使用Zend_Registry的實例,但您也可以指定您希望的任何其他對象。

注意,他們也是國家:

請注意,註冊表,也容器不是全球性的。這意味着您需要訪問引導程序才能獲取資源。

我檢查了sourcecode for Zend_Application_Bootstrap_BootstrapAbstract,容器確實是一個新的Zend_Registry實例。就像他們在手冊中說的那樣,這是一個本地註冊表,並不是通過setInstance()設置爲全局實例。所以,如果你指的是全球Zend_Registry你得到getInstance(),那麼答案是否定的。數據庫適配器不會在那裏。

注意:我不完全確定,數據庫適配器甚至存儲在本地註冊表對象中,因爲我找不到任何有關插件的參考。 registerPluginResource()似乎將資源放入數組中。儘管你的問題並不重要。答案仍然是否定的。

+0

一如既往的偉大回應, 當轉儲註冊表對象時,我可以看到它實際上創建了公共變量「public」db'=> object(Zend_Db_Adapter_Pdo_Mysql)「。但仍然沒有得到如何從中獲得它grobal registry,那麼我只是再次將db設置爲註冊表。現在將使用它。只是想使用已有的東西,這就是爲什麼我問這個問題,歡呼 – simple 2010-03-15 06:58:35

+0

@simple當你說,*傾銷註冊表對象*你是指引導程序內的引導程序或全球?全局註冊表與bootstrap中的本地註冊表不同。你必須使用'Zend_Registry :: setInstance($ bootstrap-> getContainer())'將本地實例設置爲全局實例;'如果你想將本地實例變爲全局實例或覆蓋'getContainer( )'方法在你的引導類中用'Zend_Registry :: getInstance()'而不是新的'Zend_Registry'創建容器。 – Gordon 2010-03-15 07:17:28

+0

ooo現在雲不在了=),說實話還不知道爲什麼需要本地註冊表(在哪裏使用),但無論如何非常感謝,現在我必須從註冊表(全球和本地)看架構透視=) – simple 2010-03-15 07:32:55

1

據我所知,默認情況下,Zend_Registry沒有任何東西。你必須在你的Bootstraps _init ...方法之一中自己做這件事。

+0

是你的權利我擡起頭,但不知何故什麼是錯當u vardump註冊表後和前引導db資源=) – simple 2010-03-15 06:13:00

1

你可以把它添加到註冊表自己在你的引導類:

protected function _initAddDbToRegistry() 
{ 
    $this->bootstrap('db'); 
    $db = $this->getResource('db'); 

    Zend_Registry::set('db', $db); 
} 

不過,如果你只是想在數據庫適配器,那麼有多種選擇:

首先,Zend_Application_Resource_Db將設置數據庫適配器作爲默認Zend_Db_Table類,這樣你就可以在你的應用程序中使用的任何地方檢索:

$db = Zend_Db_Table::getDefaultAdapter(); 

或者,您可以通過前端控制器進行檢索。在一個控制器動作,你可以使用:

$bootstrap = $this->getInvokeArg('bootstrap'); 
$db = $bootstrap->->getResource('db'); 

或整個應用程序,這將工作:

$bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap'); 
db = $bootstrap->->getResource('db');