1

在 ZF2 的项目中,我正在创建我的自定义库供应商/TestVendor/TestLibrary/。在这个库中,我想创建 2 个类:TestClass 和 TestClassTable。TestClass 应该实例化我的自定义对象,TestClassTable 应该处理数据库和表。而且我需要在TestClass类表中使用DBAdapter来访问数据库和表。

代码如下所示:

在模块索引控制器中,我从 TestClass 创建对象

类 TestController 扩展 AbstractActionController {

$TestObject = $this->getServiceLocator()->get('TestClass');

}

在我的自定义类 vendor/TestVendor/TestLibrary/TestClass.php 我创建了一些方法:

命名空间 TestVendor\TestLibrary;

类测试类{

protected $Id;
protected $Name;

function __construct(){}

public function doMethodOne() {
    $TestClassTable = new TestClassTable();
$this->Id = 1;
$TestObjectRow = $TestClassTable->getTestObjectById($this->Id);
$this->Name = $TestObjectRow['Name'];
return $this;
}

}

在 TestClassTable 类中我想访问数据库

命名空间 TestVendor\TestLibrary;

使用 Zend\Db\TableGateway\AbstractTableGateway;

类 TestClassTable 扩展 AbstractTableGateway {

public function __construct() {

    $this->table = 'table_name';
    $this->adapter = $this->getServiceLocator()->get('Zend\Db\Adapter\Adapter');

}

public function getTestObjectById($Id) {

    $Id  = (int) $Id;
    $rowset = $this->select(array('id' => $Id));
    $row = $rowset->current();
    return $row;
}

}

当然,尝试在我的类 TestClassTable 中访问服务定位器或数据库适配器会带来错误。

看来我的方法是错误的。

非常感谢。

4

2 回答 2

1

如果您手动注入 DBAdapter,您的代码是高度耦合的,使用服务管理器有助于解决此问题,但是您仍然将自己耦合到 DBAdapter。根据您要实现的目标,有多种方法可以将您的供应商代码与此分离。看看数据映射器模式适配器模式- 使用@Andrew 建议的服务管理器。

注意:ZF2 中供应商中的库应该是一个单独的项目并通过 composer 包含在内。

于 2013-08-23T08:28:57.273 回答
0

您应该使用服务管理器将其注入到您的类中。

服务管理器配置:

return array(
    'factories' => array(
         'MyClass' => function($sm) {
            $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
            $myClass = new \MyNamespace\MyClass($dbAdapter);
            // I would have a setter, and inject like that but
            // using the constructor is fine too
            //$myclass->setDbAdapter($dbAdapter);

            return $myClass;
        },
    )
)

现在你可以在你的控制器中获取一个实例,数据库适配器已经为你注入了:

SomeController.php

public function indexAction()
{
    $MyObject = $this->getServiceLocator()->get('MyClass');
}
于 2013-08-19T13:49:27.633 回答