Php 模块间共享的ZF2模型

Php 模块间共享的ZF2模型,php,zend-framework2,zend-framework-mvc,Php,Zend Framework2,Zend Framework Mvc,我刚刚开始为一个新项目建立一个新的ZF2应用程序,它基于ZF2框架,我正在看他们关于ZF2的教程 tl;dr:我应该如何在多个不同的模块之间共享一个模型,将其放在更高级别的某个地方(外部/模块) 我们有几个模块设置如下: / /module/ModuleName /module/ModuleName/config /module/ModuleName/src /module/ModuleName/src/ModuleName 我正要设置一个文件夹/module/ModuleName/src/M

我刚刚开始为一个新项目建立一个新的ZF2应用程序,它基于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将允许您从任何有问题的模块中获取类的实例

(二)

在您请求之前,服务管理器实际上不会创建任何实例,因此没有您建议的开销

从上面的示例中,在您第一次请求实例之前,没有实际创建的实例:

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

例如,如果您从未向服务经理索要“角色映射器”,则不会创建任何实例。

非常感谢您的回复!你说得对:2,看起来我在wincachegrind看的东西不对。好消息!在一些教程中,我看到了很多关于
UserMapper
——这只是一个例子,还是一个实际的ZF2东西?关于#1:那么,如果我注册
Manufacturing\Model\WorkflowTable'=>函数($sm){..}
,那么我是否应该能够在任何其他库中调用
$this->getServiceLocator()->get('Manufacturing\Model\WorkflowTable')
?在我们的模型中有一个基本模块是一种更标准的做法吗?是的,这是一个想法,您可以在任何模块中调用它,所有Service Manager配置都组合在一起,因此您可以从所有模块中获得任何东西UserMapper只是我使用的一个示例,对于人们来说,使用DataMapper映射器模式是一种常见的情况。如果没有一个包含所有模型的基本模块,我肯定会将其拆分为逻辑模块,理想情况下可以重用。这取决于项目的规模。汉克斯·安德鲁!我通常也会这样做,尽管我们会有许多通用模型用于所有模块。e、 制造业将使用工作流模型,但库存、订购或物流也可以使用工作流模型。我不会在不同的模块间复制模型。。。