2

我有一个具有属性的Candidate实体$xmlContent,该属性用于获取对其他实体(国家、公民、...)的一些引用,$xmlContent 值包含这些实体的 ID,如下所示,

<data>
  <countryId>2</countryId>
  <citizenship>4</citizenship>
  <!-- ... -->
</data>

注意:我知道,模型设计得很糟糕!我无法修改它,这是我开始研究它时项目奇怪的限制之一。

Id因此,我为每个$xmlContent 值创建了 getter 和 setter 。

问题,

我创建了一个表单来编辑候选对象(包括 $xmlContent Id),然后添加了 getter 和 setter 来获取这些值(getCountry()、getCitizenship()、...)

问题是我想让用户Country从所有可用国家的列表中选择(例如)的值,我还必须将正确的国家作为默认国家。

然后我决定使用实体字段,

    ->add('country', 'entity', array(
        'class' => 'MyBundle:Country',
        'query_builder' => function(CountryRepository $er) {
            return $er->createQueryBuilder('c')
                ->orderBy('c.rank', 'ASC');
        },
        'property' => 'Name'
    ))

但是,这里我遇到了另一个问题,我用来获取候选 Country 的 getter 返回一个“Id”,但实体字段需要一个对象。

我的问题,

处理这个问题的最佳方法是什么?

我的约束,

我想让我的代码尽可能干净:)

4

2 回答 2

1

既然您说您添加了 getter 和 setter,我想您可以修改模型,但不能修改它在数据库或映射中的表示,对吗?

我认为您的 getter / setter 不应该返回 ids / 更改 xmlContent。相反,如果之前没有构建,getter 应该读取 id 并构建相应的实体。setter 应该只修改以前的对象,并且您应该实现生命周期回调,以便 xmlContent 在持久化之前是最新的。

这样,表单很容易绑定到您的数据。

于 2012-12-04T19:48:56.110 回答
0

也许你应该看看DataTransformersEventSubscribers

您可以使用 DataTransformer 将您解析xmlContent为离散属性并填充它们的字段,例如countrycitizenship

使用 EventSubscriber,您可以 a)PRE_BIND将表单数据反向转换为xmlContent* 和 b) 转换您的表单元素,例如获取国家/地区并country从数据中创建/更改选择元素。

* DataTransformers 在这里不起作用,因为您不只是想反向转换,即字符串到实体,而是想将来自多个字段(国家、公民身份等)的数据合并和转换为单个字段(xmlContent)。

于 2012-12-05T08:32:13.300 回答