【问题标题】:How to map symfony2's form collection field to a doctrine's array type field?如何将 symfony2 的表单集合字段映射到学说的数组类型字段?
【发布时间】:2012-05-16 02:50:43
【问题描述】:

我的表单 (AbstractType) 映射到一个(学说坚持的)实体。

该实体有一个属于教义类型的字段array

根据 symfony 的文档,应该可以将表单集合字段映射到 PHP 的 array,但显然当表单映射到实体时它不起作用。 Symfony 期望该字段是一个关系,但它只是一个array

这不是实际代码,只是一个示例:

考虑这个(教义坚持的)实体:

class Article
{
   ...
    /**
     * @ORM\Column(type="array")
     */
    protected $tags;   
   ...
}

还有这个实体(不受教义管理):

class Tag
{
   ...
    public $name;
   ...
}

还有这个表单类型:

class ArticleType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('tags', 'collection', array('type' => new TagType()));
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => '\Entity\Article',
        );
    }
}

标签的表单类型:

class TagType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('name', 'text');
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => '\Entity\Tag',
        );
    }
}

当试图实例化 ArticleType 学说时会抱怨类似的事情:

Expected argument of type "\Entity\Tag", "array" given

在文件中:

vendor/symfony/src/Symfony/Component/Form/Extension/Core/DataMapper/PropertyPathMapper.php 第 47 行

是否可以在不编写自己的字段类型的情况下做我想做的事?

更新:也许我应该改写我的问题:我如何告诉 symfony 不要将此字段映射到任何内容(如果我更改其名称 symfony 抱怨实体没有这样的属性)?

【问题讨论】:

    标签: php forms symfony doctrine


    【解决方案1】:

    array 类型最终会转换为序列化字符串,将其映射到集合类型是不合适的。更好的方法应该是创建一个自定义字段类型,其中getParent 是“文本”,并附加一个数据转换器,它将用户输入转换为数组,反之亦然。检查this 食谱条目。

    【讨论】:

    • 这对我来说不是一个可行的解决方案。上面的代码只是一个例子。实际上,每个子表单都比单个文本字段复杂一些。
    【解决方案2】:

    我错过了一件事。我加载了包含集合属性中的关联数组数组的固定装置(此处为tags)。在将固定装置更改为实体数组(此处为Tag 实例数组)后,我忘记重新加载固定装置。

    现在一切都完美无缺,所以ineed symfony 可以将表单集合映射到array 和关系(ArrayCollection)。不同之处在于 - 我不必手动保留关系的反面。

    所以这是我的错。还是谢谢。

    【讨论】:

      猜你喜欢
      • 2013-12-11
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      相关资源
      最近更新 更多