php - CollectionType 中的 EntityType:获取 query_builder 中的当前对象
问题描述
使用EntityType
inside 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 作为唯一参数...
是否有解决方法?有任何想法吗?
解决方案
您可以使用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);
});
}
}
推荐阅读
- abap - 并排结构值比较并显示差异?
- android - 使用 -show_entries 获取音频 MAX_level 统计信息时,FFprobe 会更改 FPS
- python - 添加时间到假期,引用另一个数据框
- javascript - 如何在 TypeScript 中合并两个具有共享 ID 的对象数组?
- three.js - React-Three-Fiber 动画在滚动时重置
- excel - 如何将公式应用于每一行的整个工作表
- python - 使用 while 循环的装饰器
- android - Xamarin/Android - 无法获取提供程序 com.google.firebase.provider.FirebaseInitProvider
- php - 从 Axios Post 请求正文获取 Laravel 的参数
- sql - VBA 动态表 (ListObject)