Symfony 3: Передача переменных в формы


Я создаю с использованием форм Symfony 3, и мне нужно получить коллекцию, которая зависит от текущего пользователя, в форме для отображения в раскрывающемся списке.

Используя EntityType Я могу получить список всех сущностей, но я хочу иметь возможность запускать пользовательский запрос, который извлекает только те, которые связаны с текущим объектом пользователя.

Я прочитал документацию по формам и типу сущности, и в ней объясняются пользовательские запросы и упоминается передача в коллекции в качестве аргумента. Но я нигде не могу найти инструкций о том, как это достигается.

В идеале я хотел бы либо передать коллекцию, которую я курировал в контроллере, передать объект пользователя для выполнения запроса внутри формы, либо иным образом получить доступ к идентификатору пользователя в форме для выполнения запроса.

Кто-нибудь нашел решение для чего-либо подобного?

Author: Mrshll1001, 2017-03-29

2 answers

Вам следует попробовать с

Передайте объект пользователя для выполнения запроса внутри формы

  1. Определите требуемый параметр user в преобразователе параметров :

    public function configureOptions(OptionsResolver $resolver)
    {
        // ...
        $resolver->setRequired('user');
        // type validation - User instance or int, you can also pick just one.
        $resolver->setAllowedTypes('user', array(User::class, 'int'));
    }
    

Это заставит вас пройти user опцию, чтобы вы не забыли об этом.

  1. Передайте экземпляр пользователя или идентификатор пользователя в качестве опции в форму.

В контроллере это может выглядеть так:

$this->createForm(SomeFormType::class, $underlyingObjectOrNull, array(
    'user' => $this->getUser(),
));
  1. Создайте пользовательский запрос на EntityType поле:

    $user = $options['user'];
    $builder->add('someField', EntityType::class, array(
        'class' => 'AppBundle:SomeEntity',
        'query_builder' => function (EntityRepository $er) use($user) {
            return $er->createQueryBuilder('u')
               //.. -> some method building the query builder
        },
    ));
    

Пожалуйста, обратите внимание на use($user) часть, которая дает вам доступ к этой переменной внутри анонимной функции.

 5
Author: Jakub Matczak, 2017-03-29 11:52:06

Вот как вы можете передать пользовательскую коллекцию в форму.

Например: Сущность продукта;

Внутренний контроллер

$form = $this->createForm(ProductType::class, $product, array('recommended_product' => $recommendedProduct));

Внутренний тип формы

 $builder
   ->add('recommended_product', EntityType::class, array(
            'class' => 'AppBundle\Entity\Product',
            'choices' => $options['recommended_product'],
            'choice_label' => function (Product $user) {
                return $user->getProduct();
            }
        ));

 public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'AppBundle\Entity\Product',
        'recommended_product' => array()
    ));
}
 1
Author: Gabf Hann, 2017-03-29 11:59:23