4

Zend or I say this whole framework concept is new for me. Some examples are based on tablegateway format, in which you define name of table related to that controller in 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);
            },*/

And in other example there is only 3 lines of code in Module.php telling about adapter and then intializing through __constuct()

'MYMODULE\Model\CompanyTable' =>  function($sm) {
                $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                $table = new CompanyTable($dbAdapter);
                return $table;
            },

and in class __construc()

public function __construct(Adapter $adapter) {
    $this->adapter = $adapter;
    $this->resultSetPrototype = new ResultSet();
    $this->resultSetPrototype->setArrayObjectPrototype(new Company());

    $this->initialize();
}

What I can't understand is How to choose between both of them.

4

1 回答 1

11

简单地说,您本质上想要做的是在 Zends 服务管理器中注册服务(工厂),以便您可以从应用程序中的许多类和模块中访问它们。它们就像预先包装好的物品,可以在您需要时随时使用!关键是他们已经拥有了他们所依赖的所有东西。

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

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

$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');

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

Table 模型: 您在下面的代码中所做的是将 Adapter 注入到您的 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 模型时永远不会知道其中的区别。

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

于 2013-04-11T18:58:50.523 回答