在 Symfony v3.2 中,我使用带有多个 EntityType 字段的表单,其中有数百个选项 - 每个选项都是一个相对较大的对象。
因为它们不会经常改变,所以我想在 Symfony 中使用一些缓存,加载它们一次,然后继续为 EntityType 提供数据。
我已经通过仅提取我需要的字段来减少提供给它的数据的大小,然后将其保存到缓存中。
当我从缓存中提取数据时 - 我无法使用choice_list
,因为它与 ObjectManager 分离,并且我收到错误(“必须管理传递到选择字段的实体”)。
要重新附加它,我可以使用 ObjectManager->merge(),但这意味着要为每个重新合并并重新附加到管理器的项目调用数据库。这违背了缓存的目的。
在这种情况下进行的最佳方法是什么?只是从表单中完全丢失EntityType(对于速度敏感的页面)并使用ChoiceType(这还包括更改代码许多部分的逻辑)?还有比这更好的吗?
到目前为止,我没有在 SO 或其他地方找到任何接近解决方案的内容。
我在分析我的表单时遇到了同样的问题。我面临的问题之一是添加二级缓存 https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/second-level-cache.html使用时非常容易QueryBuilder
,但是EntityRepository
方法不直接使用该缓存。
解决方案实际上非常简单。只需添加一些缓存设置到您的query_builder
。这里有一个Symfony 文档中的示例 https://symfony.com/doc/4.0/reference/forms/types/entity.html#query-builder:
$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
{
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)