您好我是ZendFrame工作的新手......我已经按照一些基本教程使用doctrine orm构建模块 . 我已经成功完成了所有教程 .
我现在正在尝试创建具有魔术getter和setter的实体,而不是为实体类的每个属性编写所有getter和setter:
/* Magic getter to expose protected properties.
*
* @param string $property
* @return mixed
*/
public function __get($property) {
return $this->$property;
}
/**
* Magic setter to save protected properties.
*
* @param string $property
* @param mixed $value
*/
public function __set($property, $value) {
$this->$property = $value;
}
这就是我用来处理控制器中的表单的方法:
$user = new User();
$builder = new DoctrineAnnotationBuilder($entityManager);
$form = $builder->createForm($user);
$form->setHydrator(new DoctrineHydrator($entityManager,'Module/Entity/User'));
$form->bind($user);
if($this->getRequest()->isPost())
{
$form->setData($this->getRequest()->getPost());
if($form->isValid()) {
$u = $form->getData();
var_dump($u);exit();
}
}
当我提交带有正确数据的表单时,表单提交时没有任何错误,但表单中User对象的属性为null:
object(Module\Entity\User)[272]
private 'id' => null
private 'firstname' => null
private 'lastname' => null
private 'email' => null
private 'password' => null
private 'rdate' => null
private 'role' => null
这可能是因为Form对象仅在绑定到它的对象类的getter和setter上进行中继....但我不确定...... :(
是否有任何解决方案可以使用魔法getter和setter来处理zend表单?
1 回答
首先,这与Zend Framework 2无关.MantrineObject水合器负责保湿对象 .
其次,你错误地实例化水化器 . 如果查看its source,则第二个参数是一个布尔值,指示是否应该使用实体的公共API(getter / setter方法) .
因为你传递一个字符串,它总是计算为true,它指示水合器实际使用getter和setter方法,并且因为这些方法不存在,所以它们不会被调用 .
如果你想绕过任何类逻辑并且只是使用Reflection从对象中获取/设置值,你应该以这种方式实例化水化器:
$form->setHydrator(new DoctrineHydrator($entityManager, false));
然而,这在OOP世界中是一个可怕的想法 - 绕过逻辑,使用魔法 . 初学者倾向于创造这样的捷径 . 关于如何创建good, maintanable code的一些好的教程,因为我不打算在这里介绍这些主题 .