我在Symfony中有一个表单类型,它显示在每个页面列表中,我想捕捉它以避免不必要的数据库查询,因为它使用两个EntityTypes字段:
->add('brand', EntityType::class, [
'required' => false,
'class' => Brand::class,
'choice_label' => 'name',
'query_builder' => function (BrandRepository $er) {
return $er->createQueryBuilder('b')
->orderBy('b.name', 'ASC');
},
])
->add('car_manufacturer', EntityType::class, [
'class' => CarManufacturer::class,
'choice_label' => 'name',
'required' => false,
'query_builder' => function (CarManufacturerRepository $er) {
return $er->createQueryBuilder('m')
->orderBy('m.name', 'ASC');
},
])
->add('Search', SubmitType::class);
在控制器中,我尝试这样做:
private function getFiltersForm(): FormInterface {
$cachedForm = $this->cache
->getItem('form_list_filters')
->expiresAfter(3600*24);
if (!$cachedForm->isHit()) {
$form = $this->formFactory->createNamedBuilder('', SearchItemType::class)->getForm();
$cachedForm->set($form);
$this->cache->save($cachedForm);
}
return $cachedForm->get();
}
但是它不起作用,isHit()
总是假的,表单总是重新生成的,这让我觉得保存过程中一定有一些问题。
有什么想法吗?先谢谢你了。
1条答案
按热度按时间ars1skjm1#
Symfony缓存要求对象可由PHP序列化-
https://symfony.com/doc/current/components/cache/cache_items.html
如果你把你的对象 Package 在一个try catch中,并尝试serialize()它,你可以很容易地测试出来。