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

时间:2014-04-30 23:54:32

标签: php forms symfony

我不确定这是否是默认行为,但我在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,但这也显示了新公司的名称两次,而不是旧公司的名称和新公司的名称。

1 个答案:

答案 0 :(得分:1)

这实际上是PHP 5的一个功能。

在PHP 4中,对象按值传递,就像任何其他变量一样。将对象分配给变量时,该变量包含一个完整对象,与原始对象分开。您可以随后修改原始对象而不修改变量的值。

在PHP 5中,对象通过引用传递。如果您熟悉&号运算符,它也会做同样的事情。以下是通过引用传递的manual entry

这意味着您的$currentOldEmployment变量会引用$person对象,然后您通过Symfony表单提交修改该对象。要在修改对象后保留这些旧值,您可以clone通过$currentOldEmployment = clone $person->getCurrentEmployment() Cerad说明{{1}}对象。这有效地在该时刻创建了对象的快照。阅读PHP5中对象克隆的manual entry中的更多信息。