【问题标题】:Symfony2 Forms old object variable gets updated after form bindSymfony2 Forms旧对象变量在表单绑定后更新
【发布时间】:2014-04-30 23:54:32
【问题描述】:

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

【问题讨论】:

  • 这是预期行为,因为 currentEmployment 是一个对象。对象本身没有变化,只有它的属性。试试 $currentOldEmployment = clone $person->getCurrentEmployment();制作副本。

标签: php forms symfony


【解决方案1】:

这实际上是 PHP 5 的一个特性。

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

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

这意味着您的 $currentOldEmployment 变量引用了 $person 对象,然后您通过 Symfony 表单提交对其进行修改。要在修改对象后保留这些旧值,您可以 clone 对象,正如 Cerad 通过$currentOldEmployment = clone $person->getCurrentEmployment() 所说的那样。这有效地创建了当时对象的快照。在manual entry 中阅读更多关于 PHP5 中对象克隆的内容。

【讨论】:

    猜你喜欢
    • 2011-08-03
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多