Zend Framework 2:如何在自定义库中获取DBAdapter

时间:2013-08-19 13:05:52

标签: php zend-framework2

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

代码如下所示:

在模块索引控制器中,我从TestClass

创建对象

类TestController扩展了AbstractActionController {

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

}

在我的自定义类供应商/ TestVendor / TestLibrary / TestClass.php中,我创建了一些方法:

命名空间TestVendor \ TestLibrary;

类TestClass {

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中尝试访问服务定位器或数据库适配器会带来错误。

看起来我的做法是错误的。

非常感谢。

2 个答案:

答案 0 :(得分:1)

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

注意:ZF2中供应商的库应该是一个单独的项目&包括通过作曲家。

答案 1 :(得分:0)

您应该使用服务管理器将它注入您的班级。

Service Manager配置:

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