在Symfony v3.2中,我使用的表单包含多个EntityType字段,这些字段有数百个选项 - 每个选项都是一个相对较大的对象。 由于它们不经常更改,我想在Symfony中使用一些Cache,加载它们一次,然后继续使用它来提供EntityType。
通过拉动我需要的字段,我已经减少了提供数据的大小,然后将其保存到缓存中。
当我从缓存中提取数据时 - 我无法使用choice_list
将其直接提供给EntityType,因为它与ObjectManager分离,并且我收到错误("实体传递给必须管理选择字段" )。
要重新附加它,我可以使用ObjectManager-> merge(),但这意味着要为重新合并并重新连接到Manager的每个项目调用DB。这超过了缓存的目的。
在这种情况下,最好的方法是什么?只是从Form中完全丢失EntityType(对于速度敏感的页面)并使用ChoiceType(也包括更改代码的许多部分中的逻辑)?还有比这更好的东西吗?
到目前为止,我还没有在SO或其他地方找到任何接近解决方案的东西。
答案 0 :(得分:1)
我在分析表单时遇到了同样的问题。我遇到的一个问题是,在使用QueryBuilder
时添加Second level caching非常容易,但EntityRepository
方法不会立即使用该缓存。
解决方案实际上非常简单。只需向query_builder
添加一些缓存设置即可。这是example from the Symfony documentation:
$builder->add('users', EntityType::class, array(
'class' => User::class,
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('u')
//add something like this
->setCacheable(true)
->setCacheMode(Cache::MODE_NORMAL)
->setCacheRegion('default')
->orderBy('u.username', 'ASC');
},
'choice_label' => 'username',
));
不要忘记将二级缓存添加到您的实体中:
/**
* @ORM\Entity
* @ORM\Cache(region="default", usage="NONSTRICT_READ_WRITE")
*/
class User
{
}