Symfony 4嵌套集合by_reference不起作用

时间:2018-09-25 08:10:26

标签: php collections doctrine domain-driven-design symfony4

我有一个复杂的表格问题

这是描述电影(场景,元素,条件等)的模板程序


它看起来像这样: enter image description here

在元素集合中,我有一个嵌套的集合选项:

enter image description here

我的怪异问题是: 当我提交整个表单时,以下设置方法将发送一个数组而不是一个集合。内容在更新表单上,提交时已设置好收藏集。

/**
 * @param Collection $options
 * @return Element
 */
public function setOptions($options): Element
{
    if (!$options instanceof Collection) {
        var_dump($options);
        var_dump('fall here');exit;
        $this->options = new ArrayCollection($options);
    } else {
        var_dump($options);
        $this->options = $options;
    }


    return $this;
}

奇怪的事情:

/**
 * @param \App\Domain\Toto\Template\Entity\ElementOptions $option
 * @return $this
 */
public function addElementOptions(ElementOptions $option): self
{
    var_dump('Element::addElementOptions'); exit;
    $option->setElement($this);
    $this->options->add($option);

    return $this;
}

/**
 * @param ElementOptions $option
 */
public function removeElementOptions(ElementOptions $option)
{
    $this->options->removeElement($option);
}

从不叫。

我的建议是,表单生成器中的by_reference选项在嵌套集合中不起作用。

但是我真的不知所措,对于我可能错过的建议我将不胜感激。

以下是与此嵌套集合相关的代码:

Element.orm(一个元素具有一个或多个elementOption)

<one-to-many field="options" target-entity="App\Domain\Toto\Template\Entity\ElementOptions" mapped-by="element" fetch="LAZY">
    <cascade>
    <cascade-all/>
    </cascade>
</one-to-many>

ElementOption实体

<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
    <entity name="App\Domain\Toto\Template\Entity\ElementOptions" table="tpl_element_options">
        <id name="id" type="integer" column="id">
            <generator strategy="IDENTITY"/>
        </id>
        <many-to-one field="element" target-entity="App\Domain\Toto\Template\Entity\Element" inversed-by="options" fetch="LAZY">
            <join-columns>
                <join-column name="element_id" referenced-column-name="id" on-delete="CASCADE"/>
            </join-columns>
        </many-to-one>
        <many-to-one field="type" target-entity="App\Domain\Toto\Template\Entity\Type">
            <join-columns>
                <join-column name="type_id" referenced-column-name="id" on-delete="CASCADE" nullable="1"/>
            </join-columns>
        </many-to-one>
        <field name="value" type="string" column="value" length="150" precision="0" scale="0" nullable="false">
            <options>
                <option name="comment">This column stores the value for the option</option>
            </options>
        </field>
    </entity>
</doctrine-mapping>

元素表单构建器,elementOption集合的声明

        ->add('options', CollectionType::class,
            [
                'entry_type'     => ElementOptionsForm::class,
                'by_reference'   => false,
                'allow_add'      => true,
                'allow_delete'   => true,
                'prototype'      => true,
                'prototype_name' => '__ELEMENT_OPTION__',
                'attr'           => [
                    'class' => 'table scene-elements-option',
                ],
                'label' => 'templates.new.form.scene.element.option.title'
            ]
        );

在控制器中,我的表单中填充了以下值:

    $form = $this->formFactory->create($type, $data, $options);
    $form->handleRequest($this->requestStack->getCurrentRequest());

    return $form;

0 个答案:

没有答案