2013-02-26 168 views
5

我刚刚开始为基于ZF2框架的新项目建立一个新的ZF2应用程序,并且正在查看他们的教程Models模块之间共享ZF2模型

tl; dr:我应该如何在多个不同模块之间共享模型,方法是将模型放置在更高级别(外部/模块)中的某个位置?

我们有几个模块的设置,像这样:

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

我正要安装的文件夹/module/ModuleName/src/ModuleName/Model/TableName.php,但后来我意识到:该表将需要其他模块访问为好。所以我该怎么做?

我应该把模型文件夹放在/module/Model中,否则会导致它被当作模块,即site.com/model(基于我们当前的配置)。

我应该在地点之间复制和粘贴模型吗?我应该将模型粘贴在/vendor/library/Company/Model的某处吗?不太确定是否有最佳做法!

问题2:本教程还建议使用ServiceManager实例化数据库模型以使用相同的实例。如果我有一个带有5个控制器的模块,每个控制器访问完全独立的表格(例如每个表格有4个表格)会怎样?在我看来,它会冗余地初始化每个页面加载的16个表(对于该模块中的其他控制器)。单个表初始化会为页面加载增加55ms。有没有解决的办法??我不知道如何根据本教程的初始化tablegateway将配置移动到控制器的操作上?

回答

8

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. 

如果你不能要求“角色映射”服务管理器,例如,则没有实例被创建。

+0

非常感谢您的回复安德鲁!你说得对:#2,看起来我在wincachegrind中看着错误的东西。好消息!我在几篇教程中看到过很多“UserMapper” - 这只是一个例子,还是一个真正的ZF2?关于#1:所以如果我注册'Manufacturing \ Model \ WorkflowTable'=> function($ sm){..}',那么我应该能够调用'$ this-> getServiceLocator() - > get 'Manufacturing \ Model \ WorkflowTable')'在其他库中?在我们的模型中使用基础模块会更标准吗? – Benno 2013-02-26 23:42:30

+0

是的,这是主意,你可以在任何模块中调用它,所有的服务管理器配置组合在一起,这样你就可以从所有模块获取任何东西 – Andrew 2013-02-27 08:31:06

+0

UserMapper只是我用过的一个例子,人们使用DataMapper映射器模式 – Andrew 2013-02-27 08:32:13