首页 > 解决方案 > CollectionType 中的 EntityType:获取 query_builder 中的当前对象

问题描述

使用EntityTypeinside aCollectionType时,是否可以访问 EntityTypequery_builder函数内的当前集合对象?

主要形式:

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 的文档说这是不可能的:

使用可调用对象时,您将通过实体的 EntityRepository 作为唯一参数...

是否有解决方法?有任何想法吗?

标签: phpsymfonysymfony-forms

解决方案


您可以使用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);
        });

    }
}

推荐阅读