2013-02-26 167 views
5

我剛剛開始爲基於ZF2框架的新項目建立一個新的ZF2應用程序,並且正在查看他們的教程Models模塊之間共享ZF2模型

tl; dr:我應該如何在多個不同模塊之間共享模型,方法是將模型放置在更高級別(外部/模塊)中的某個位置?

我們有幾個模塊的設置,像這樣:

/ 
/module/ModuleName 
/module/ModuleName/config 
/module/ModuleName/src 
/module/ModuleName/src/ModuleName 

我正要安裝的文件夾/module/ModuleName/src/ModuleName/Model/TableName.php,但後來我意識到:該表將需要其他模塊訪問爲好。所以我該怎麼做?

我應該把模型文件夾放在/module/Model中,否則會導致它被當作模塊,即site.com/model(基於我們當前的配置)。

我應該在地點之間複製和粘貼模型嗎?我應該將模型粘貼在/vendor/library/Company/Model的某處嗎?不太確定是否有最佳做法!

問題2:本教程還建議使用ServiceManager實例化數據庫模型以使用相同的實例。如果我有一個帶有5個控制器的模塊,每個控制器訪問完全獨立的表格(例如每個表格有4個表格)會怎樣?在我看來,它會冗餘地初始化每個頁面加載的16個表(對於該模塊中的其他控制器)。單個表初始化會爲頁面加載增加55ms。有沒有解決的辦法??我不知道如何根據本教程的初始化tablegateway將配置移動到控制器的操作上?

回答

8

1)

你可以使用任何模式在應用程序的任何模塊,這樣他們就可以「共享」。例如,您使用ServiceManager來幫助您獲取項目中模型(和其他類)的實例。

服務管理器配置:

'factories' => array(
    'AuthService' => function($sm) { 
     $auth = new \Zend\Authentication\AuthenticationService(); 

     return $auth; 
    }, 
    'RoleMapper' => function($sm) { 
     $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
     $mapper = new \Application\Mapper\RoleMapper; 
     $mapper->setDbAdapter($dbAdapter); 
     $mapper->setEntityPrototype(new \Application\Model\Role); 
     $mapper->setHydrator(new \Application\Model\RoleHydrator); 

     return $mapper; 
    }, 
    'UserMapper' => function($sm) { 
     $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
     $mapper = new \MyModule\Mapper\UserMapper; 
     $mapper->setDbAdapter($dbAdapter); 
     $mapper->setEntityPrototype(new \MyModule\Model\User); 
     $mapper->setHydrator($sm->get('UserHydrator')); 

     return $mapper; 
    }, 
    .... 

正如你可以看到你可以從那裏定義了多個模塊類。通常你會爲每個模塊定義一個單獨的ServiceManager配置。

有什麼可讓你的應用程序模塊內部「UserMapper」的一個實例,這樣阻止你:

有些控制器:

$this->getServiceLocator()->get('UserMapper'); 
// Or even grab Zend libraries like this 
$this->getServiceLocator()->get('AuthService'); 

的的ServiceManager將允許您從任何搶的類的實例你的模塊內的任何其他問題。

2)

服務管理器,直到你要求它實際上並沒有做任何事情的情況下,所以沒有開銷,你的建議。

從上面的例子中,沒有實例實際創建直到你先問一個:

$this->getServiceLocator()->get('UserMapper'); // instance now created. 

如果你不能要求「角色映射」服務管理器,例如,則沒有實例被創建。

+0

非常感謝您的回覆安德魯!你說得對:#2,看起來我在wincachegrind中看着錯誤的東西。好消息!我在幾篇教程中看到過很多「UserMapper」 - 這只是一個例子,還是一個真正的ZF2?關於#1:所以如果我註冊'Manufacturing \ Model \ WorkflowTable'=> function($ sm){..}',那麼我應該能夠調用'$ this-> getServiceLocator() - > get 'Manufacturing \ Model \ WorkflowTable')'在其他庫中?在我們的模型中使用基礎模塊會更標準嗎? – Benno 2013-02-26 23:42:30

+0

是的,這是主意,你可以在任何模塊中調用它,所有的服務管理器配置組合在一起,這樣你就可以從所有模塊獲取任何東西 – Andrew 2013-02-27 08:31:06

+0

UserMapper只是我用過的一個例子,人們使用DataMapper映射器模式 – Andrew 2013-02-27 08:32:13