symfony4 Form -- вывести связанную сущность в виде выпадающего списка select

В процессе создания админки для интернет магазина мне потребовалось вывести для заполнения не только текстовые поля объекта Product, но и все имеющиеся в БД фирмы в виде списка.

Это можно сделать так:

  1. Создаём форму в контроллере
    // src/Controller/ProductController.php
    /**
         * Creates a new product entity.
         *
         * @Route("/new", name="product_new")
         * 
         * @Method({"GET", "POST"})
         * 
         * @return Response
         */
        public function newAction(Request $request, FirmGetter $firmGetter): Response
        {
            $form = $this->createForm(ProductType::class);
            $form->handleRequest($request);
    
            if ($form->isSubmitted() && $form->isValid()) {
                // сохраняем новый Product в БД и перенаправляем админа на страницу просмотра
    
                return $this->redirectToRoute('product_show', [
                    'id' => $product->getId(),
                ]);
            }
            
            return $this->render('product/new.html.twig', [
                'form' => $form->createView(),
            ]);
        }
  2. Класс, описывающий форму
    // src/Form/ProductType.php
    /**
         * @param FormBuilderInterface $builder
         * @param array                $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->add('name', TextType::class, [
                'label' => 'Название',
            ])
                  // здесь могут быть и другие поля продукта (описание, цена и т.п.)
             ->add('firm', EntityType::class, [
                'label' => 'Фирма',
                'class' => Firm::class,
            ]);
        }
  3. Чтобы Symfony знал, какое поле сущности выводить в списке, добавим в класс Entity\Firm.php магический метод __toString():
    public function __toString()
        {
          return $this->getLabel();
        }
  4. Выводим форму в шаблоне с использованием twig:
    // product/new.html.twig
        {{ form_start(form, {'enctype': "multipart/form-data", 'method': 'post'}) }}
            {{form_widget(form)}}
            <input type="submit" value="Создать" formnovalidate>
        {{ form_end(form) }}

Источники