Доступ к объекту, переданному в построитель форм с помощью Symfony - PullRequest
0 голосов
/ 09 июля 2019

Я создаю форму с использованием инфраструктуры Symfony и пытаюсь понять, как передать экземпляр сущности в конструктор форм.

Контроллер:

$organization = $user->getOrganization();
$form = $this->createForm(OrganizationCourseType::class, $organization);

OrganizationCourseType класс:

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('courses', EntityType::class, [
            'class' => Course::class,
            'choice_label' => 'name',
            'multiple' => true,
            'expanded' => true,
            'query_builder' => function (EntityRepository $er) {
                return $er->createQueryBuilder('course')
                    ->andWhere('course.organization = :organization')
                    ->setParameter('organization', $organization);
            },
        ]);
    }

Однако я получаю ошибку:

Notice: Undefined variable: organization

Как я могу получить доступ к сущности (организации) в конструкторе форм? Нужно ли передавать его как вариант? Если да, то какой смысл включать его в вызов createForm в контроллере?

Ответы [ 2 ]

2 голосов
/ 09 июля 2019

Чтобы ответить на вторую часть вашего вопроса: «какой смысл включать его в вызов createForm

Когда вы передаете объект в качестве второго аргумента createFormBuilder, который вы передаетеисходные данные для формы.Symfony попытается найти свойства (или методы получения / установки), которые соответствуют имени поля формы в объекте, и присвоить его значение этому полю.Затем, при отправке, он обновит вашу модель соответствующим образом.

Вы типично пропустите тот же тип объекта, что и data_class формы, так что в вашем случае это будет OrganizationCourse.Вы можете сделать что-то вроде следующего:

$organizationCourse = new OrganizationCourse();
$organizationCourse->setOrganization($user->getOrganization());
$form = $this->createForm(OrganizationCourseType::class, $organizationCourse);

Вы можете выбрать много Courses и назначить их на Organization.Однако это не похоже на ваш вариант использования, поскольку OrganizationCourse выглядит скорее как отношение, а не как сущность, поэтому обратитесь к ответу @ ehimel .

1 голос
/ 09 июля 2019

В вашем контроллере передайте экземпляр вашей сущности в качестве третьего аргумента в строку определения $form:

$form = $this->createForm(OrganizationCourseType::class, null, ['organization' => $organization]);

Затем найдите его в своем классе FormType следующим образом:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $organization = $options['organization'];

    $builder->add('courses', EntityType::class, [
        'class' => Course::class,
        'choice_label' => 'name',
        'multiple' => true,
        'expanded' => true,
        'query_builder' => function (EntityRepository $er) {
            return $er->createQueryBuilder('course')
                ->andWhere('course.organization = :organization')
                ->setParameter('organization', $organization);
        },
    ]);
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setRequired(['organization']);
}
...