何时使用tablegateway和Adapter

时间:2013-04-11 11:09:52

标签: php zend-framework2 tablegateway

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();
}

我无法理解的是如何在两者之间做出选择。

1 个答案:

答案 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适配器,或将其与表模型和/或表网关结合使用。希望这有帮助!