首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时使用tablegateway和适配器

何时使用tablegateway和适配器
EN

Stack Overflow用户
提问于 2013-04-11 19:09:52
回答 1查看 2.5K关注 0票数 4

Zend或者我说,整个框架概念对我来说都是新的。一些示例基于tablegateway格式,在该格式中,您可以在Module.php中定义与控制器相关表名。

代码语言:javascript
复制
/* '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()进行初始化。

代码语言:javascript
复制
'MYMODULE\Model\CompanyTable' =>  function($sm) {
                $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                $table = new CompanyTable($dbAdapter);
                return $table;
            },

在__construc()类中

代码语言:javascript
复制
public function __construct(Adapter $adapter) {
    $this->adapter = $adapter;
    $this->resultSetPrototype = new ResultSet();
    $this->resultSetPrototype->setArrayObjectPrototype(new Company());

    $this->initialize();
}

我不明白的是如何在两者之间做出选择。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-12 02:58:51

简单地说,您实际上想要做的是在Zends服务管理器中注册服务(工厂),这样您就可以从应用程序中的许多类和模块中访问它们。它们就像预先打包好的对象,在你需要它们的时候就可以使用了!关键是他们已经注入了他们所依赖的一切。

现在,您可以通过各种方式在服务管理器中注册服务,例如在module.config.php或Module.php中注册服务,选择由您自己决定。重要的是要记住这一点,你只希望能够要求一些东西,而不是担心所有潜在的细节。

默认Db适配器:如果您已经在主应用程序配置(global.php和local.php)中配置了数据库设置,则会在服务管理器中自动注册此适配器。

代码语言:javascript
复制
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');

现在,您可以使用此适配器在没有任何TableGateway或表模型的情况下执行数据库功能,这也是您的选择。你可以从你的控制器中获取这个服务,你可以将它注入到模型中,或者任何你想要的东西中。

The Table model:您在下面的代码中所做的是将适配器注入到您的Table模型中。因此,在您的应用程序中,您只需从服务管理器获取Table模型服务,它就已经有了适配器。

代码语言:javascript
复制
'MYMODULE\Model\CompanyTable' =>  function($sm) {
    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
    $table = new CompanyTable($dbAdapter);
    return $table;
},

但是你的Table模型是什么呢?嗯,它可以是表的原型,表的一个函数类,或者两者都是。从技术上讲,您是创建Table模型的人,所以您可以创建所有类型的函数和注入所有类型的东西,例如:

代码语言:javascript
复制
'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模型原型化的,但它不是必须的。

代码语言:javascript
复制
'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函数的网关。

代码语言:javascript
复制
'MYMODULE\Model\CompanyTable' =>  function($sm) {
    $tableGateway = $sm->get('CompanyTableGateway');
    $table = new CompanyTable($tableGateway);
    return $table;
},

总而言之,你的问题的答案是:选择权在你手中。单独使用Db Adapter,或将其与Table Model和/或Table Gateway一起使用。希望这能有所帮助!

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15947224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档