Doctrine 2 - 使用Zend Form在ObjectSelect元素上使用Magic getter

时间:2014-03-24 20:09:43

标签: php forms doctrine-orm doctrine zend-framework2

使用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'
        )
    ));
}

1 个答案:

答案 0 :(得分:1)

由于没有得到答复,我相信诀窍是设置" byValue"在DoctrineHydrator构造函数中为false。

$hydrator = new DoctrineHydrator($em, 'Users\Entity\User', false);

默认情况下,byValue为true,并指示Doctrine使用getProperty()方法。