在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中尝试访问服务定位器或数据库适配器会带来错误。
看起来我的做法是错误的。
非常感谢。
答案 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');
}