zend 2在不使用exchangearray()方法的情况下获取实体属性值

时间:2014-05-14 06:26:03

标签: php zend-framework2

我是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方法的技巧。有必要了解我,因为将来要解决这类问题。

1 个答案:

答案 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。