まず、データベースが間違った方法で設計されていることです。文字列プロパティは常に文字列である必要があり、日付プロパティは常に日付である必要があり、関係プロパティは常に関係である必要があります。これは混乱を防ぐだけでなく、パフォーマンスを向上させます (適切なプロパティがエンティティとして定義されている場合、symfony はパフォーマンスの高い結合クエリを生成し、プロキシ クラスを使用するため)。
あなたの場合、解決策があります。任意のオプションをフォーム タイプ クラスに渡し、さまざまなフィールド セットを動的に構築できます。
SomeController.php:
public function someAction()
{
$propertyType = array();
// put here your conditions to determine property type
if (property is string)
{
$propertyType['type'] = 'string';
}
else if (property is datetime)
{
$propertyType['type'] = 'datetime';
}
else if (property is entity)
{
$propertyType['type'] = 'entity';
$propertyType['class'] = '\Acme\DemoBundle\Entity\Something';
}
$form = $this->createForm(new SomeFormType(), $someData, array('propertyType' => $propertyType));
}
SomeFormType.php:
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setRequired(array(
'propertyType',
));
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$array = array('required' => true, 'label' => 'Your label');
if ($options['propertyType']['type'] == 'entity'
$array['class'] = $options['propertyType']['class']
$builder
->add('title', $options['propertyType']['type'], $array)
;
}