【问题标题】:Clone an entity before form bind在表单绑定之前克隆实体
【发布时间】:2013-05-31 05:43:57
【问题描述】:

使用 Symfony2,我需要先保存一个实体,然后再使用 $form->bind() 在刷新之前比较新旧实体。

我尝试了一些功能:

$command = $repository->findCommandProductsByCommand( $id );
$old_command = clone $command;
// OR $old_command = $command;
$form = $this->createForm(new EditCommandType(), $command);

if( $request->getMethod() == 'POST' )
{
    $form->bind($request);
    if ( $form->isValid() )
    {

我试图像这样保存实体的一小部分:

$old_command = $command->getCommandProducts();

但是当我尝试使用其中一种方法访问 $old_command 的数据时,我只能从表单中访问对象的新值,而不是旧值。

$form->bind($request) 是主要问题,但我没有找到描述 bind() 的确切作用的文档。

最好的问候

我的案例的解决方案(感谢 zizoujab)

$command_entries = new ArrayCollection();
foreach ($command->getCommandproducts() as $entry) {
    $command_entries[] = clone $entry;
}

现在我的 ArrayCollection $command_entries 没有链接到之前的实体。

【问题讨论】:

  • bind() 获取提交的数据并将这些值设置为您的实体上各自的设置器(如果您传递实体)。您是否正在尝试将旧数据与新数据进行比较?例如,确保密码更改没有使用与以前相同的密码?

标签: forms symfony entity bind


【解决方案1】:

来自克隆手册:

当一个对象被克隆时,PHP 5 将执行所有对象的浅拷贝 对象的
特性。任何引用其他变量的属性都将保持引用。

我假设getCommandProducts() 返回一个ArrayCollection,因此您将始终获得新列表。

你也必须克隆列表的元素。

这里是完整的解释和解决方案的示例: Symfony2/Doctrine: How to re-save an entity with a OneToMany as a cascading new row

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 2012-07-22
    • 2016-03-17
    • 1970-01-01
    • 2011-02-20
    • 2019-02-27
    • 2010-11-30
    相关资源
    最近更新 更多