以 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 对象怎么样?
我是否可以在单个 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 对象怎么样?