使用Doctrines'ObjectSelect
使用Zend Form填充表单元素时,property
参数需要相应实体中的getPropertyName()
方法。
我们能够告诉ObjectSelect
使用魔法getter,e.x而不是为实体中的每个受保护属性创建getter。 __get('PropertyName')
?
如果一个表有+100列,我们应该为每个列创建getter,或者我们可以使用魔术getter来填充表单元素吗?
实体
namespace Users\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="tbl_users")
* @property int $id
* @property string $firstname
*/
class User{
/**
* @ORM\Id
* @ORM\Column(type="integer");
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string")
*/
protected $firstname;
/**
* Exposes protected properties
*
* @param string $prop
*/
public function __get($prop){
return $this->$prop;
}
/**
* Saves protected properties
*
* @param string $prop
* @param mixed $val
*/
public function __set($prop, $val){
$this->$prop = $val;
}
}
表格
namespace Users\Form;
use Zend\Form\Form;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use DoctrineModule\Persistence\ObjectManagerAwareInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\ORM\EntityManager;
class UserForm extends Form implements ObjectManagerAwareInterface{
protected $em;
public function __construct(EntityManager $em, $name = null){
parent::__construct('Edit User');
$hydrator = new DoctrineHydrator($em, 'Users\Entity\User');
$this->setHydrator($hydrator);
$this->add(array(
'type' => 'DoctrineModule\Form\Element\ObjectSelect',
'name' => 'firstname',
'options' => array(
'object_manager' => $em,
'target_class' => 'Users\Entity\User',
'property' => 'firstname'
)
));
}
答案 0 :(得分:1)
由于没有得到答复,我相信诀窍是设置" byValue"在DoctrineHydrator构造函数中为false。
$hydrator = new DoctrineHydrator($em, 'Users\Entity\User', false);
默认情况下,byValue为true,并指示Doctrine使用getProperty()方法。