EntityType внутри CollectionType: получить текущий объект внутри query_builder - PullRequest
3 голосов
/ 25 марта 2019

При использовании EntityType внутри CollectionType возможно ли получить доступ к текущему объекту коллекции внутри функции query_builder EntityType?

Основная форма:

class UsersType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('users', CollectionType::class, array('entry_type' => UserType::class));
    }
}

Подформа:

class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('mainPost', EntityType::class, array(
                'class' => Post::class,
                'query_builder' => function (PostRepository $postRepository) {
                    return $postRepository->findPostsOfUser(); // <= Here I'd like to pass the *current* user to the repository
                },
            ))
        ;
    }
}

Причина: я не хочу видеть все сообщений у каждого пользователя, но только сообщения этого пользователя.

EntityType'sдокументы говорят, что это невозможно:

При использовании вызываемого объекта вам будет передан EntityRepository объекта в качестве аргумента only ...

Может быть, есть обходной путь?Есть идеи?

1 Ответ

1 голос
/ 26 марта 2019

Вы можете сделать обходной путь с FormEvents.В событии PRE_SET_DATA устанавливаются данные для одного объекта пользователя.Вы можете переписать это так:

use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;

class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('mainPost', EntityType::class, array(
                'class' => Post::class,
            ))
        ;

        $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
            $user = $event->getData();
            $form = $event->getForm();

            $field = $form->get('mainPost');
            $options = $field->getConfig()->getOptions();
            $options['query_builder'] = function (PostRepository $postRepository) use ($user) {
                return $postRepository->findPostsOfUser($user);
            };

            $form->add($field->getName(), EntityType::class, $options);
        });

    }
}
...