Zend或者我说这整个框架概念对我来说都是新的。一些示例基于tablegateway格式,您可以在其中定义Module.php中与该控制器相关的表的名称。
/* 'MYMODULE\Model\CompanyTable' => function($sm) {
$tableGateway = $sm->get('CompanyTableGateway');
$table = new CompanyTable($tableGateway);
return $table;
},
'CompanyTableGateway' => function ($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new Company());
return new TableGateway('rs_company', $dbAdapter, null, $resultSetPrototype);
},*/
在其他示例中,Module.php中只有3行代码告诉适配器,然后通过__constuct()进行初始化
'MYMODULE\Model\CompanyTable' => function($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$table = new CompanyTable($dbAdapter);
return $table;
},
并在课堂上__construc()
public function __construct(Adapter $adapter) {
$this->adapter = $adapter;
$this->resultSetPrototype = new ResultSet();
$this->resultSetPrototype->setArrayObjectPrototype(new Company());
$this->initialize();
}
我无法理解的是如何在两者之间做出选择。
答案 0 :(得分:11)
简单地说,您基本上想要做的是在Zends服务管理器中注册服务(工厂),以便您可以从应用程序中的许多类和模块中访问它们。它们就像预先包装好的物品,可以在需要时随时使用!重点是他们已经拥有了他们已经注入的所有东西。
现在,您可以通过各种方式在服务管理器中注册服务,例如从module.config.php或Module.php中选择服务。要记住的重要一点是,你只想要能够提出要求,而不是担心所有潜在的细节。
默认的Db适配器: 如果已在主应用程序配置(global.php和local.php)中配置了数据库设置,则此适配器将自动在服务管理器中注册。
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
现在,您可以使用此适配器来执行数据库功能而无需任何TableGateway或Table模型,您的选择也是如此。您可以从控制器中获取此服务,您可以将其注入模型中,或者将任何漂浮在您的船上。
表格模型: 您在下面的代码中所做的是将适配器注入表模型。因此,从您的应用程序中,您只需从服务管理器中获取Table模型服务,它就已经有了适配器。
'MYMODULE\Model\CompanyTable' => function($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$table = new CompanyTable($dbAdapter);
return $table;
},
但你的桌面模型是什么?好吧,它可能是表的原型,表的一类函数,或两者兼而有之。从技术上讲,你是创建Table模型的人,所以你可以创建各种函数并注入各种东西,比如:
'MYMODULE\Model\CompanyTable' => function($sm) {
$table = new CompanyTable();
$table->setAdapterService( $sm->get('Zend\Db\Adapter\Adapter') );
$table->setSessionService( $sm->get('MYMODULE\Session') );
$table->setCustomService( $sm->get('MYMODULE\Custom') );
return $table;
},
考虑一下,如果您有多个不同的数据库适配器,如果主数据库或辅助数据库发生故障,则会进行故障转移。您可以注入第一个可用的适配器,并且您的应用程序在调用Table模型时永远不会知道它们之间的区别。
TableGateway: TableGateway就是它听起来的样子。它是Zends TableGateway的一个实例,它给出了表名,Db Adapter,甚至可以使用Table模型进行原型化。什么是原型设计?那么,这样做基本上不是在进行数据库查询时返回带有数据的正常结果集,而是将数据作为Table模型的实例返回。同样,在服务管理器中注册网关时,关键是应用程序可以抓取并使用它,而无需担心适配器或表的名称或其他任何内容。在这个例子中,它是用你的Table模型原型化的,但它不一定是。
'CompanyTableGateway' => function ($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new Company());
return new TableGateway('rs_company', $dbAdapter, null, $resultSetPrototype);
},
使用TableGateway时,您可以将它提供给Table模型而不是适配器,并且您可以编写Table模型以使用所有Db函数的网关。
'MYMODULE\Model\CompanyTable' => function($sm) {
$tableGateway = $sm->get('CompanyTableGateway');
$table = new CompanyTable($tableGateway);
return $table;
},
总而言之,您问题的答案是:选择权归您所有。单独使用Db适配器,或将其与表模型和/或表网关结合使用。希望这有帮助!