Symfony 3: Передача переменных в формы
Я создаю с использованием форм Symfony 3, и мне нужно получить коллекцию, которая зависит от текущего пользователя, в форме для отображения в раскрывающемся списке.
Используя EntityType
Я могу получить список всех сущностей, но я хочу иметь возможность запускать пользовательский запрос, который извлекает только те, которые связаны с текущим объектом пользователя.
Я прочитал документацию по формам и типу сущности, и в ней объясняются пользовательские запросы и упоминается передача в коллекции в качестве аргумента. Но я нигде не могу найти инструкций о том, как это достигается.
В идеале я хотел бы либо передать коллекцию, которую я курировал в контроллере, передать объект пользователя для выполнения запроса внутри формы, либо иным образом получить доступ к идентификатору пользователя в форме для выполнения запроса.
Кто-нибудь нашел решение для чего-либо подобного?
2 answers
Вам следует попробовать с
Передайте объект пользователя для выполнения запроса внутри формы
-
Определите требуемый параметр
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
опцию, чтобы вы не забыли об этом.
- Передайте экземпляр пользователя или идентификатор пользователя в качестве опции в форму.
В контроллере это может выглядеть так:
$this->createForm(SomeFormType::class, $underlyingObjectOrNull, array(
'user' => $this->getUser(),
));
-
Создайте пользовательский запрос на
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)
часть, которая дает вам доступ к этой переменной внутри анонимной функции.
Вот как вы можете передать пользовательскую коллекцию в форму.
Например: Сущность продукта;
Внутренний контроллер
$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()
));
}