Я строю с использованием форм Symfony 3, и мне нужно получить коллекцию, которая зависит от текущего пользователя, в форме для отображения в раскрывающемся списке.
С использованием EntityType
Я могу получить список всех сущностей, но я хочу иметь возможность запускать пользовательский запрос, который извлекает только те, которые связаны с текущим объектом пользователя.
Я прочитал документацию по формам и EntityType, и он объясняет пользовательские запросы и упоминает передачу в качестве аргумента коллекции. Но я не могу найти инструкции о том, как это достигается нигде.
В идеале я хотел бы либо передать коллекцию, которую я курировал в Controller, передать объект User, чтобы выполнить запрос внутри формы, либо иным образом получить доступ к идентификатору пользователя в форме, чтобы выполнить запрос.
Кто-нибудь нашел решение для чего-нибудь подобного?
Вы должны попробовать с
передать объект User для запуска запроса внутри формы
Определите обязательный параметр 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));
внутри FormType
$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()
));
}