Symfony:如何缓存FormInterface对象

pw136qt2  于 2023-04-07  发布在  其他
关注(0)|答案(1)|浏览(81)

我在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()总是假的,表单总是重新生成的,这让我觉得保存过程中一定有一些问题。
有什么想法吗?先谢谢你了。

ars1skjm

ars1skjm1#

Symfony缓存要求对象可由PHP序列化-https://symfony.com/doc/current/components/cache/cache_items.html
如果你把你的对象 Package 在一个try catch中,并尝试serialize()它,你可以很容易地测试出来。

https://www.php.net/manual/en/language.oop5.serialization.php

相关问题