Symfony表单实体类型缓存

3
在Symfony v3.2中,我正在使用一个带有多个EntityType字段的表单,这些字段有数百个选项 - 每个选项都是相对较大的对象。由于它们不经常更改,我想在Symfony中使用一些缓存,只加载一次并继续向EntityType提供数据。
我已经通过仅获取所需字段并将其保存到缓存中来减小了提供给它的数据大小。
当我从缓存中获取数据时,我不能直接使用choice_list将其提供给EntityType,因为它与ObjectManager分离,并出现错误(“传递给选择字段的实体必须受到管理”)。要重新附加它,我可以使用ObjectManager->merge(),但这意味着对每个被重新合并和重新附加到管理器的项目进行DB调用。这违背了缓存的目的。
在这种情况下,最好的方法是什么?只是完全从表单中删除EntityType(对于速度敏感的页面),并使用ChoiceType(这也包括在代码的许多部分中更改逻辑)?还有比那更好的东西吗?
到目前为止,我在SO或其他地方没有找到任何解决方案。

Doctrine二级缓存怎么样?请参考http://symfony.com/doc/current/bundles/DoctrineBundle/configuration.html获取快速参考。 - Massimiliano Arione
谢谢,我会查一下。我看到Symfony提到它现在被标记为“实验性的”,但值得一看。如果可能不起作用,我将需要将最大的EntityType字段转换为ChoiceTypes,以便能够缓存然后使用纯数组数据。 - userfuser
@MassimilianoArione,你有没有尝试过或者后来成功使用过二级缓存? - userfuser
当然了。这很简单。 - Massimiliano Arione
在我修正了一些不经意间犯下的错误之后,它开始工作了,所以显然它并不是那么复杂。但是我仍然会说只有当你确切知道自己在做什么时,它才是简单的。我将在接下来的几天里在这里发布我的情景。 - userfuser
那你是怎么让它工作的呢?我不确定如何在Symfony中启用二级缓存... - kironet
1个回答

1
我在分析我的表单时遇到了同样的问题。其中一个问题是,当使用QueryBuilder时,添加二级缓存非常容易,但EntityRepository方法默认不使用该缓存。
解决方案实际上非常简单。只需向您的query_builder添加一些缓存设置。这是来自Symfony文档的示例
$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
{

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接