我是zend framewrok的新手2.我正在练习zf2文档提供的专辑应用程序。之后我创建了另一个控制器,即PersonalInfo。在PersonalInfo实体中,我使用了一个属性,即dt,它不会通过表单输入更新。它默认在数据库中更新。这是我的实体。
class PersonalInfo {
protected $id;
protected $name;
protected $fName;
protected $email;
protected $picture;
protected $dt;
public function exchangeArray($data) {
$this->id = (!empty($data['id'])) ? $data['id'] : null;
$this->name = (!empty($data['name'])) ? $data['name'] : null;
$this->fName = (!empty($data['fName'])) ? $data['fName'] : null;
$this->email = (!empty($data['email'])) ? $data['email'] : null;
$this->picture = (!empty($data['picture'])) ? $data['picture'] : null;
}
// Add the following method:
public function getArrayCopy() {
return get_object_vars($this);
}
public function getId() {
return $this->id;
}
public function setId($id) {
$this->id = $id;
}
public function getName() {
return $this->name;
}
public function setName($name) {
$this->name = $name;
}
public function getFName() {
return $this->fName;
}
public function setFName($fName) {
$this->fName = $fName;
}
public function getEmail() {
return $this->email;
}
public function setEmail($email) {
$this->email = $email;
}
public function getPicture() {
return $this->picture;
}
public function setPicture($picture) {
$this->picture = $picture;
}
public function getDt() {
return $this->dt;
}
public function setDt($dt) {
$this->dt = $dt;
}
如果我不使用$ this-> dt =(!empty($ data ['dt'])),我很奇怪? $ data ['dt']:null;在exchangeArray方法然后getDt()方法返回null但是如果我在exchangeArray方法中使用它而不是返回实际数据。在我的一般理解中,我不清楚exchangeArray方法的技巧。有必要了解我,因为将来要解决这类问题。
答案 0 :(得分:1)
如果您查看http://framework.zend.com/manual/2.0/en/user-guide/database-and-models.html#using-servicemanager-to-configure-the-table-gateway-and-inject-into-the-albumtable,您会发现所有这些信息都在您的工厂中定义
'AlbumTableGateway' => function ($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new Album());
return new TableGateway('album', $dbAdapter, null, $resultSetPrototype);
}
定义中感兴趣的部分是new ResultSet()
和setArrayObjectPrototype()
方法
如果你看一下\Zend\Db\ResultSet\ResultSet
,你会发现需要exchangeArray
方法 - > https://github.com/zendframework/zf2/blob/master/library/Zend/Db/ResultSet/ResultSet.php#L65
该要求的原因是,当您迭代结果集时,ResultSet
本身会克隆您的原型,然后调用exchangeArray
,使用行数据有效地“保湿”您的对象 - &gt ; https://github.com/zendframework/zf2/blob/master/library/Zend/Db/ResultSet/ResultSet.php#L105
因此,总而言之,如果您没有在exchangeArray
方法中显式设置所有属性,则以上述方式使用时,从db中获取时它们将始终保持为null。