Doctrine2如何设置Id值


How does Doctrine2 set the Id values

出于好奇,我有一个关于Doctrine2内部工作原理的问题。作为一个用户,我看到了一个非常干净和健壮的界面,但一定有一些沉重的魔法在幕后工作。

当我生成一个简单的实体时,它看起来像这样:

class SimpleEntity
{
    /**
     * @ORM'Id
     * @ORM'Column(type="integer")
     * @ORM'GeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     * @ORM'Column(type="string")
     */
    protected $title;
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * Set title
     *
     * @param string $title
     */
    public function setTitle($title)
    {
        $this->title = $title;
    }
    /**
     * Get title
     *
     * @return string 
     */
    public function getTitle()
    {
        return $this->title;
    }
}

你会注意到有一件事明显没有,没有办法设置id,但是理论工厂返回具有设置id的实体。这怎么可能呢?

如何能够覆盖受保护的值而不在类层次结构中?

答案是反射。看到http://www.doctrine-project.org/docs/orm/2.1/en/tutorials/getting-started-xml-edition.html第一个原型

在不深入研究Doctrine源代码的情况下,我想说它使用了ReflectionProperty::setValue()