簡體   English   中英

模塊之間共享的ZF2模型

[英]ZF2 Models shared between Modules

我剛剛開始基於ZF2骨架為新項目設置一個新的ZF2應用程序,我正在查看他們關於模型的教程。

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

我們有幾個模塊設置如下:

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

我正要設置一個文件夾/module/ModuleName/src/ModuleName/Model/TableName.php ,但后來我意識到:該表也需要在其他模塊中訪問。 所以我該怎么做?

我應該將Models文件夾放在/module/Model否則會導致它被視為一個模塊,即site.com/model(基於我們當前的配置,它會)。

我應該在地方之間復制和粘貼模型嗎? 我應該將模型重新放在/vendor/library/Company/Model嗎? 不太確定是否有最好的做法!

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

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.

例如,如果您從未向服務經理詢問“RoleMapper”,則不會創建任何實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM