Symfony2的基于FormTypeGuesser注释的行为在生产中失败

问题描述 投票:0回答:2

我正在开发一个应用程序,该应用程序使用从服务调用的生成器命令来根据Web表单中的用户配置输入生成实体。

我在dropDown中使用常规的Doctrine Types [布尔,整数,字符串,文本,...]来进行字段类型配置。 加上自定义类型“ ValueList”,用于为最终用户提供选项,从中可以在生成的表单的“下拉列表”框中为生成的实体进行选择。

在开发中,它工作顺利。 但是在生产中,使用“ ValueList”字段的所有新生成的实体都会将此字段呈现为输入文本,而不是按预期选择。

如果我手动rm app/cache/prod/annotations/*则刷新后即可使用。

我通过创建Annotation @ValueList来实现这一点,该Annotation @ValueList被添加到刚刚生成的实体的属性字段中。 class FormTypeGuesser extends DoctrineOrmTypeGuesser ,对于DoctrineOrmTypeGuesser猜测为“文本”字段的任何字段,我都会检查@ValueList批注。

因此,有没有办法告诉Annotations Parser查找任何新更改?

symfony caching doctrine-orm annotations
2个回答
1
投票

您可以覆盖annotations.file_cache_reader定义,并提供您自己的缓存服务,以扩展基类FileCacheReader

然后,您将只需要在服务中实现一个方法,该方法将强制为特定实体类生成缓存。

您可以在此处找到annotations.file_cache_reader的定义symfony/src/Symfony/Bundle/FrameworkBundle/Resources/config/annotations.xml

有关服务覆盖的更多信息,请参见此处


0
投票

在阅读自己的代码以获取过去的代码片段时,我意识到我正在使用Symfony注解_读取器服务,该服务实际上是FileCacheReader类,除非将debug参数初始化为true,否则它将无法跟踪该类中的更改。

如我所不能(我认为)[编辑:我可以按照@rolebi的要求覆盖Symfony实例化此服务的方式,并且我不想创建基本的AnnotationReader并向其注册注释。 我决定“手动”删除相关的缓存文件。

public function clearAnnotationsCache(DocumentType $docDefinition)
{
    // /home/juanmf/Work/GDocs/docdigital1/app/cache/[prod|dev]
    $envCacheDir = $this->_kernel->getCacheDir();
    $files = glob(sprintf( '%s/annotations/%s*', $envCacheDir, sha1($docDefinition->getClassFqcn())));
    foreach ($files as $file) { 
        if (is_file($file)) {
            unlink($file); 
        }
    }
}

sha1($docDefinition->getClassFqcn()))与FileCacheReader命名缓存类的方式匹配。 FQCN,例如'DocDigital\\Bundle\\UserBundle\\Entity\\User'

这样,我只删除了最少数量的缓存元素。

© www.soinside.com 2019 - 2024. All rights reserved.