Symfony2 Forms旧对象变量在表单绑定后更新


Symfony2 Forms old object variable gets updated after form bind

我不确定这是否是默认行为,但我正在尝试比较Symfony2应用程序中调用$form->submit($data(前后对象的旧数据。

奇怪的是,在表单绑定之后,旧变量也被更新了。

考虑这个代码:

public function editAction(Person $person, Request $request)
{
        /**
         * Get the current old employment
         */
        $currentOldEmployment = $person->getCurrentEmployment();
        /*
         * Create the form
         */
        $form = $this->createForm(new PersonType(), $person);
        /**
         * Submit the form
         */
        $form->submit($data);
        if($form->isValid()) {
            if($currentEmployment) {
                $oldCompany = $currentOldEmployment->getCompany();
                $newCompany = $person->getCurrentEmployment()->getCompany();
                // compare and trigger something if different
                ...
            }
            return View::create($oldCompany->getName() . " " . $newCompany->getName(), 400);
       }

奇怪的是,这总是会输出两次新公司的名称。我甚至用$oldPerson=clone$person尝试过,但这也会显示新公司的名称两次,而不是一次显示旧公司,一次显示新公司。

这实际上是PHP5的一个特性。

在PHP4中,对象和其他任何变量一样是按值传递的。将对象指定给变量时,该变量包含一个完整的对象,与原始对象分离。随后,您可以在不修改变量值的情况下修改原始对象。

在PHP5中,对象是通过引用传递的。如果你熟悉"与"运算符,它也会做同样的事情。这是关于通过引用传递的手动输入。

这意味着$currentOldEmployment变量引用$person对象,然后通过Symfony表单提交对其进行修改。要在修改对象后保留这些旧值,可以通过$currentOldEmployment = clone $person->getCurrentEmployment()对对象进行clone。这有效地创建了对象在该时刻的快照。阅读PHP5中有关对象克隆的手动条目中的更多信息。