symfony 3 Вложенные формы 2/3 уровня -- как получить прототип -- Как во вложенную коллекцию вложить ещё одну

В конструкторе формы родителя надо указать .что вы хотите получить и универсальный конструктор для потомка (например родитель Tags уже вложенная коллекция, а в неё мы хотим вложить Methods):

use AppBundle\Entity\Tag;
namespace AppBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;

class TagType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name');
        
            $builder->add('methods', CollectionType::class, array(
            'entry_type' => MethodType::class,
            'allow_add'    => true,
            'by_reference' => false,
            'allow_delete' => true,
            'prototype' => true,  // это важно
            'prototype_name' => '__opt_prot__' // это строка для замены на ID в HTML
        ));
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Tag::class,
        ));
    }
}

-- это описание формы для TAGS, куда можно вкладывать Methods (другие сущности) получить универсальный прототип для методов (с двумя плэйсхолдерами) теперь можно так:

{{ form_start(form) }}
    {# render the task's only field: description #}
    {{ form_row(form.description) }}

    <h3>Tags</h3>
    {{ dump(form) }}
    <ul class="tags" data-prototypeee="{{ form_widget(form.tags.vars.prototype.methods.vars.prototype)|e('html_attr') }} data-prototype="{{ form_widget(form.tags.vars.prototype)|e('html_attr') }}">
        {# iterate over each existing tag and render its only field: name #}
        {% for tag in form.tags %}
            <li  class="tag">{{ form_row(tag.name) }}                 

                <ul class="methods" data-prototype="{{ form_widget(tag.methods.vars.prototype)|e('html_attr') }}" > 
                        {% for method in tag.methods %}
                            <li class="methods">    {{ form_row(method.name) }} </li>
                        {% endfor %}
                </ul>
            </li>
        {% endfor %}
    </ul>

{{ form_end(form) }}

А именно строкой:

form.tags.vars.prototype.methods.vars.prototype

Почитать ещё:

http://stackoverflow.com/questions/16487...