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();
}我不明白的是如何在两者之间做出选择。
发布于 2013-04-12 02:58:51
简单地说,您实际上想要做的是在Zends服务管理器中注册服务(工厂),这样您就可以从应用程序中的许多类和模块中访问它们。它们就像预先打包好的对象,在你需要它们的时候就可以使用了!关键是他们已经注入了他们所依赖的一切。
现在,您可以通过各种方式在服务管理器中注册服务,例如在module.config.php或Module.php中注册服务,选择由您自己决定。重要的是要记住这一点,你只希望能够要求一些东西,而不是担心所有潜在的细节。
默认Db适配器:如果您已经在主应用程序配置(global.php和local.php)中配置了数据库设置,则会在服务管理器中自动注册此适配器。
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');现在,您可以使用此适配器在没有任何TableGateway或表模型的情况下执行数据库功能,这也是您的选择。你可以从你的控制器中获取这个服务,你可以将它注入到模型中,或者任何你想要的东西中。
The Table model:您在下面的代码中所做的是将适配器注入到您的Table模型中。因此,在您的应用程序中,您只需从服务管理器获取Table模型服务,它就已经有了适配器。
'MYMODULE\Model\CompanyTable' => function($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$table = new CompanyTable($dbAdapter);
return $table;
},但是你的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模型时,它永远不会知道其中的区别。
The TableGateway: The TableGateway就像它听起来那样。它是Zends的一个实例,被赋予表名Db Adapter,甚至可以使用TableGateway模型进行原型设计。什么是原型设计?基本上,当您进行数据库查询时,它不是返回包含数据的普通结果集,而是将数据作为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时,您只需将其提供给您的表模型,而不是适配器,并且您将编写您的表模型以使用所有Db函数的网关。
'MYMODULE\Model\CompanyTable' => function($sm) {
$tableGateway = $sm->get('CompanyTableGateway');
$table = new CompanyTable($tableGateway);
return $table;
},总而言之,你的问题的答案是:选择权在你手中。单独使用Db Adapter,或将其与Table Model和/或Table Gateway一起使用。希望这能有所帮助!
https://stackoverflow.com/questions/15947224
复制相似问题