我正在开发一个应用程序,该应用程序使用从服务调用的生成器命令来根据Web表单中的用户配置输入生成实体。
我在dropDown中使用常规的Doctrine Types [布尔,整数,字符串,文本,...]来进行字段类型配置。 加上自定义类型“ ValueList”,用于为最终用户提供选项,从中可以在生成的表单的“下拉列表”框中为生成的实体进行选择。
在开发中,它工作顺利。 但是在生产中,使用“ ValueList”字段的所有新生成的实体都会将此字段呈现为输入文本,而不是按预期选择。
如果我手动rm app/cache/prod/annotations/*
则刷新后即可使用。
我通过创建Annotation @ValueList来实现这一点,该Annotation @ValueList被添加到刚刚生成的实体的属性字段中。 class FormTypeGuesser extends DoctrineOrmTypeGuesser
,对于DoctrineOrmTypeGuesser猜测为“文本”字段的任何字段,我都会检查@ValueList批注。
因此,有没有办法告诉Annotations Parser查找任何新更改?
您可以覆盖annotations.file_cache_reader
定义,并提供您自己的缓存服务,以扩展基类FileCacheReader
。
然后,您将只需要在服务中实现一个方法,该方法将强制为特定实体类生成缓存。
您可以在此处找到annotations.file_cache_reader
的定义symfony/src/Symfony/Bundle/FrameworkBundle/Resources/config/annotations.xml
有关服务覆盖的更多信息,请参见此处 。
在阅读自己的代码以获取过去的代码片段时,我意识到我正在使用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'
这样,我只删除了最少数量的缓存元素。