gpt4 book ai didi

php - 模块之间共享的 ZF2 模型

转载 作者:可可西里 更新时间:2023-11-01 13:50:38 25 4
gpt4 key购买 nike

我刚刚开始为一个新项目设置一个新的 ZF2 应用程序,基于 ZF2 框架,我正在查看他们在 Models 上的教程。 .

tl;dr:我应该如何在多个不同的模块之间共享一个模型,将它放在更高级别的某个地方(在/module 之外)?

我们有几个模块设置如下:

/
/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 的某个地方吗?不太确定是否有最佳实践!

问题二:教程也建议使用ServiceManager实例化数据库模型,使用同一个实例。如果我有一个包含 5 个 Controller 的模块,每个 Controller 访问完全独立的表(比如每个 4 个表)怎么办?在我看来,它会在每次页面加载时冗余地初始化 16 个表(对于该模块中的其他 Controller )。单个表初始化会增加 55 毫秒的页面加载时间。有没有解决的办法??我不确定如何根据教程初始化 tablegateway 的操作将配置移动到 Controller 的操作?

最佳答案

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”的实例:

一些 Controller :

$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”,则不会创建任何实例。

关于php - 模块之间共享的 ZF2 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15083002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com