Php 模块间共享的ZF2模型
我刚刚开始为一个新项目建立一个新的ZF2应用程序,它基于ZF2框架,我正在看他们关于ZF2的教程 tl;dr:我应该如何在多个不同的模块之间共享一个模型,将其放在更高级别的某个地方(外部/模块) 我们有几个模块设置如下: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
/
/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、 制造业将使用工作流模型,但库存、订购或物流也可以使用工作流模型。我不会在不同的模块间复制模型。。。