Symfony Form EntityType缓存

时间:2017-04-03 12:46:13

标签: forms symfony caching entity query-builder

在Symfony v3.2中,我使用的表单包含多个EntityType字段,这些字段有数百个选项 - 每个选项都是一个相对较大的对象。 由于它们不经常更改,我想在Symfony中使用一些Cache,加载它们一次,然后继续使用它来提供EntityType。

通过拉动我需要的字段,我已经减少了提供数据的大小,然后将其保存到缓存中。

当我从缓存中提取数据时 - 我无法使用choice_list将其直接提供给EntityType,因为它与ObjectManager分离,并且我收到错误("实体传递给必须管理选择字段" )。 要重新附加它,我可以使用ObjectManager-> merge(),但这意味着要为重新合并并重新连接到Manager的每个项目调用DB。这超过了缓存的目的。

在这种情况下,最好的方法是什么?只是从Form中完全丢失EntityType(对于速度敏感的页面)并使用ChoiceType(也包括更改代码的许多部分中的逻辑)?还有比这更好的东西吗?

到目前为止,我还没有在SO或其他地方找到任何接近解决方案的东西。

1 个答案:

答案 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
{

}