Как symfony узнает тип этого объекта, полученного из формы?

Я использую symfony 2.8 с доктриной (и все еще учусь, как вы увидите).

У меня есть этот контроллер, в котором я создаю некоторую форму и визуализирую ее. Я не понимаю, как symfony может знать тип объекта $contract ниже. Однако эти объекты $contract попадают в мою базу данных в таблице контрактов, поэтому должно быть что-то (магическое?), Я не понимаю, что происходит.

class MyContractsController extends BaseController
{
    public function addAction(Request $request)
    {
        $form = $this->createForm(MultiNewType::class)->handleRequest($request);

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            foreach ($form->getData()['contracts'] as $contract) {
                $em->persist($contract);
            }
            $em->flush();
            return $this->validResponse();
        }
        return $this->renderModalFormResponse($form, array(
            'formTemplate' => 'MyBundle:Form:Contract/multiNew.html.twig'
        ));
    }

Ниже файл MultiNewType, в котором я не вижу ничего, связанного с контрактом.

class MultiNewType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('contracts', 'collection', array(
            'type' => new NewInlineType(),
            'allow_add' => true,
            'allow_delete' => true,
            'delete_empty' => true,
            'label' => false
        ));
    }

    public function getName()
    {
        return 'contractMultiNew';
    }
}

И NewInlineType, в котором я вижу все поля таблицы контрактов, но нигде не вижу контракт:

class NewInlineType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('foo', 'bar', array(
                'label' => false,
                'class' => 'MyBundle:MyClass',
            ))
            ->add('format', FormatType::class, array(
                'label' => false,
            ))
            ->add('version', VersionType::class, array(
                'label' => false,
            ))
            ->add('debut', 'datePicker', array(
                'label' => false,
                'placeholder' => 'Début'
            ))
            ->add('fin', 'datePicker', array(
                'label' => false,
                'placeholder' => 'Fin'
            ));
    }

    public function getName()
    {
        return 'contractNew';
    }

    public function getParent()
    {
        return 'contractEdit';
    }
}

Спасибо

это должен быть MyBundle:MyClass, но вы должны заменить его на свой Entitys fcn, например `App\Entities\Contract`

zedling 10.12.2020 09:35

Тип родительской формы (у которого метод getName() возвращает 'contractEdit') должен иметь public function configureOptions(), который устанавливает значение параметра data_class по умолчанию, или у него должна быть родительская форма, которая это делает.

Arleigh Hix 10.12.2020 10:22

Я не уверен, возможно это или нет, но, возможно, data_class настроен в src/AppBundle/Resources/config/services.yml

Arleigh Hix 10.12.2020 10:28

Вы уверены, что фактический NewInlineType имеет add('foo', 'bar', array( ? Использование bar в качестве типа не имеет смысла. Я предполагаю, что ваш data_class определен в типе 'bar'.

Cerad 10.12.2020 16:47

@ArleighHix Я почти уверен, что вы поняли, configureOptions() настройка класса Contract находится в классе Contract/EditType.php !! Большое вам спасибо :) вы хотите опубликовать ответ, чтобы я мог его принять?

Yvon 11.12.2020 10:16
JS - События опций формы
JS - События опций формы
В продолжение предыдущей статьи CSS - стили, связанные с вводом формы , в этой статье мы будем использовать JS для взаимодействия с формами, на этот...
CSS - Стили, связанные с вводом формы
CSS - Стили, связанные с вводом формы
Общими стилями ввода для форм являются Input (включая Text, Radio, checkbox), Select и Textarea, из которых Input относительно прост, поэтому в этой...
Создание многостраничной формы заявления о приеме на работу с помощью Angular
Создание многостраничной формы заявления о приеме на работу с помощью Angular
Наличие на корпоративном сайте форм заявлений о приеме на работу, или "трудовых анкет", экономит время и деньги как для соискателей, так и для...
0
5
144
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш NewInlineType имеет родительскую форму, как указано в методе getParent().
Родительская форма в этом случае вернет 'contractEdit' из своего getName() метода.
В родительской (или, возможно, прародительской) форме вы должны найти что-то вроде следующего:

use AppBundle\Entity\Contract;
use Symfony\Component\OptionsResolver\OptionsResolver;

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

Это в значительной степени делает то, что он говорит; установка параметра data_class по умолчанию для имени вашего класса контракта.

Другие вопросы по теме