gpt4 book ai didi

Symfony 表单实体类型缓存

转载 作者:行者123 更新时间:2023-12-05 06:40:11 26 4
gpt4 key购买 nike

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

我已经通过只提取我需要的字段并将其保存到缓存中来减少为其提供数据的大小。

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

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

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

最佳答案

我在分析我的表单时遇到了同样的问题。我面临的问题之一是添加 Second level caching使用 QueryBuilder 时非常容易,但 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
{

}

关于Symfony 表单实体类型缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43185050/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com