[英]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.