以 Symfony2 形式分配和更新实体 属性

Assign and update entity property in Symfony2 form

我是否可以在单个 Symfony2 表单中分配一个实体并编辑其中一个属性?

示例:

任务有很多活动。

当我创建 Activity 时,我通过实体表单字段分配任务。我还想在创建实体时更新任务 remainingEstimateInSeconds。

Activity实体:

<?php

namespace AppBundle\Entity;

/**
 * Activity
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="AppBundle\Entity\ActivityRepository")
 */
class Activity
{

    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @Assert\NotNull()
     * @ORM\ManyToOne(targetEntity="Task")
     */
    private $task;
}

任务实体:

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Task
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="AppBundle\Entity\TaskRepository")
 */
class Task
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @Assert\NotBlank()
     * @ORM\Column(name="title", type="string", length=255)
     */
    private $title;

    /**
     * @ORM\Column(name="remainingEstimateInSeconds", type="integer", length=255, nullable=true)
     */
    private $remainingEstimateInSeconds;
}

Activity 表格:

我当前的实现使用的是非映射字段。剩余的估计被重新设置到控制器中的任务,这不是最好的实现。

<?php

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\NotNull;

class ActivityType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('description');
        $builder->add('task');
        $builder->add('remainingEstimateInSeconds', 'integer', array(
            'mapped' => false,
            'constraints' => array(
                new NotNull()
            )
        ));
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(
            array(
                'data_class' => 'AppBundle\Entity\Activity',
            )
        );
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'activity';
    }
}

我也尝试过使用 property_path => "task.remainingEstimateInSeconds",但重复的 property_path 引发了某种错误。

在主窗体上使用带有 POST_SET_DATA 和 POST_SUBMIT 侦听器的非映射字段来预填充 field/update 对象怎么样?