Symfony OneToOne 关系呈现唯一形式

Symfony OneToOne relation render unique form

我的实体包含太多字段和数据,无法由 MySQL 处理。

所以我创建了另一个实体来存储内容并将其链接到具有 OneToOne 关系的父实体。

这是我父实体的摘录 HomeContent

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

/**
 * @var string
 *
 * @ORM\Column(name="locale", type="string", length=6)
 */
private $locale;

/**
 * @var string
 *
 * @ORM\OneToOne(targetEntity="ContentBlock", cascade={"all"})
 */
private $healthIntro;

/**
 * @var string
 *
 * @ORM\OneToOne(targetEntity="ContentBlock", cascade={"all"})
 */
private $desktopIntro;

/**
 * @var string
 *
 * @ORM\OneToOne(targetEntity="ContentBlock", cascade={"all"})
 */
private $techIntro;

// ...

public function __construct()
{
    $this->healthIntro = new ContentBlock();
    $this->desktopIntro = new ContentBlock();
    $this->techIntro = new ContentBlock();
// ...

我的 ContentBlock 实体有一个文本字段 content,带有 setter 和 getter。

现在我只想为每个字段使用 textarea 呈现我的表单,最好的方法是什么?

目前,它们被呈现为 select 元素,我定义了一个 ContentBlockType class with content 字段

// ...
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('content', 'textarea');
}
// ...

当然还有HomeContentType

// ...
 public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('title', 'text')
        ->add('metadescription', 'text')
        ->add('healthIntro', 'entity', array(
            'class' => 'NavaillesMainBundle:ContentBlock'
        ))
// ...

首先我建议遵守使用JoinColumn()注解的规则。示例:

/**
 * @var string
 *
 * @ORM\OneToOne(targetEntity="ContentBlock", cascade={"all"})
 * @ORM\JoinColumn(name="desktop_intro_id", referencedColumnName="id")
 */
private $desktopIntro;

答案:

我不知道我的方法是否最好,但我建议您创建 ContentBlockFormType 并将其嵌入到您的表单中。所以你的 HomeContent 实体的形式将是这样的:

    // ...

    public function buildForm(FormBuilderInterface $builder, array $options) 
    {
        $builder
            ->add('title', 'text')
            ->add('metadescription', 'text')
            ->add('desktopIntro', ContentBlockFormType::class, [
                 'label'                 => 'Desktop intro',
                 'required'              => false,
            ])
            ->add('healthIntro', ContentBlockFormType::class, [
                 'label'                 => 'Health intro',
                 'required'              => false,
            ])
            ->add('techIntro', ContentBlockFormType::class, [
                 'label'                 => 'Tech intro',
                 'required'              => false,
            ])
    }

    // ...