Symfony 4 Type — Как создать свой Type с Twig шаблонам?

Для создания своего собственного типа (Type) с использованием Twig шаблонов в Symfony 4, вам потребуется выполнить несколько шагов:

Шаг 1: Создание класса своего типа
Создайте новый класс, который будет представлять ваш тип. В вашем пространстве имен (namespace) можете использовать символическое имя типа, например "AppBundleFormTypeMyCustomType".

Ваш класс должен наследовать абстрактный класс AbstractType из бандла SymfonyComponentFormExtensionCoreType и переопределить несколько его методов. В частности, вам потребуется переопределить методы "buildForm" и "configureOptions".

Пример кода вашего класса MyCustomType:

namespace AppBundleFormType;

use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;

class MyCustomType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // Определение полей вашей формы
        $builder->add('field1', null, [
            'label' => 'Поле 1'
        ]);
        
        $builder->add('field2', null, [
            'label' => 'Поле 2'
        ]);
        
        // ...
    }
    
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => 'AppBundleEntityYourEntity',
            // дополнительные опции вашего типа
        ]);
    }
}

Шаг 2: Создание Twig шаблона
Далее вам нужно создать Twig шаблон, который будет использоваться для отображения формы вашего типа. В Symfony 4 все шаблоны обычно хранятся в каталоге "templates". Следуя этой практике, создайте новый файл с расширением ".html.twig" в директории "templates" вашего проекта, например "my_custom_form.html.twig".

Пример кода вашего Twig шаблона my_custom_form.html.twig:

{{ form_start(form) }}
    {{ form_row(form.field1) }}
    {{ form_row(form.field2) }}
    {# ... #}
{{ form_end(form) }}

Шаг 3: Использование своего типа в контроллере
Теперь вы можете использовать свой тип в контроллере или в другом месте, где вам нужно отобразить форму.

Пример кода вашего контроллера:

namespace AppBundleController;

use AppBundleFormTypeMyCustomType;
use SymfonyBundleFrameworkBundleControllerController;
use SymfonyComponentRoutingAnnotationRoute;

class MyController extends Controller
{
    /**
     * @Route("/my_custom_form", name="my_custom_form")
     */
    public function myCustomFormAction()
    {
        $form = $this->createForm(MyCustomType::class);
        
        return $this->render('my_custom_form.html.twig', [
            'form' => $form->createView(),
        ]);
    }
}

Теперь, когда пользователь запрашивает маршрут "/my_custom_form", ваш контроллер будет рендерить шаблон "my_custom_form.html.twig", который отобразит вашу форму, используя Twig шаблон и ваш собственный тип формы.

Таким образом, вы сможете создавать и использовать свои собственные типы форм в Symfony 4 с использованием Twig шаблонов.