У меня проблема с Symfony 3.4 EntityType.
CategoryType.php
class CategoryType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title')
->add('spec', CollectionType::class, [
'entry_type' => SpecificationType::class,
'allow_add' => true,
'allow_delete' => true,
'label' => false,
]);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Category::class,
));
}
}
SpecificationType.php
class SpecificationType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('title', EntityType::class, [
'class' => Specification::class,
'label' => false,
]);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Specification::class,
));
}
public function getBlockPrefix()
{
return 'specification';
}
}
Форма отображается должным образом: заголовок в виде текстового поля и 2 элемента выбора. Но проблема в том, что элемент выбора не выбирает выбранное значение.
form.html.twig
{{ form_widget(form.title) }}
{{ form_widget(form.spec) }}
Когда в SpecificationType.phpEntityType::class заменяется на TextField:class, теперь форма отображает не 2 элемента выбора, шину 2 ввода текста (ожидаемое поведение) и присвоенные значения правильные: 
Я начал копаться в том, как эти элементы выбора отображаются в первую очередь, и обнаружил, что этот блок {%- block choice_widget_options -%} отвечает за рендеринг элемента выбора.
Внутри этого блока находится кусочек кода:
<option value = "{{ choice.value }}"{% if choice.attr %}{% with { attr: choice.attr } %}{{ block('attributes') }}{% endwith %}{% endif %}{% if choice is selectedchoice(value) %} selected = "selected"{% endif %}>{{ choice_translation_domain is same as(false) ? choice.label : choice.label|trans({}, choice_translation_domain) }}</option>
Именно такое условие: {% if choice is selectedchoice(value) %} selected = "selected"{% endif %} отвечает за добавление атрибута selected к опции. Но value в расширении selectedchoice(value) как-то пуст, поэтому не помечает вариант как выбранный.
Может кто знает, как решить этот вопрос?
ОБНОВЛЕНО
Свойство spec определяется следующим образом:
CategoryEntity.php
/**
* @ORM\ManyToMany(targetEntity = "Specification", inversedBy = "categoryList")
* @ORM\JoinTable(name = "category_specification")
*/
private $spec;
@Djengobarm см. Обновленный раздел.






Нашел решение здесь.
Как написал @Nickolaus:
[..] You are having this problem because it is a compound form in your implementation and no simple form and symfony is unable to resolve which field created inside the subform needs to be used as source for the entity field
Итак, решение:
Рефакторинг SpecificationType.php выглядит так:
class SpecificationType extends AbstractType
{
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'class' => Specification::class,
'label' => false,
));
}
public function getParent()
{
return EntityType::class;
}
public function getBlockPrefix()
{
return 'specification';
}
}
Используйте метод getParent(), переместите все конфигурации полей в configureOptions и удалите метод buildForm().
Наконец ... столько часов потрачено впустую ...
Не могли бы вы показать, как свойство
specопределяется в сущностиCategory?