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

时间:2014-05-17 04:44:35

标签: symfony caching doctrine-orm annotations

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

我在dropDown中使用常规的Doctrine Types,[boolean,integer,string,text,...]来允许字段类型配置。加上自定义Type" ValueList"用于为最终用户提供选项,可以在生成的表单中的DropDown框中为生成的实体选择。

在开发中它运作顺利。但是在prod,任何新生成的实体,使用" ValueList"字段,将此字段呈现为输入文本,而不是按预期方式选择。

如果我手动rm app/cache/prod/annotations/*,则可以在刷新时使用。

我通过创建一个注释@ValueList来实现这一点,该注释被添加到刚刚生成的实体的propper Field中。对于DoctrineOrmTypeGuesser猜测为'文本的任何字段,class FormTypeGuesser extends DoctrineOrmTypeGuesser为{&#39}。字段我检查@ValueList注释。

那么,有没有办法告诉Annotations Parser找到任何新的变化?

2 个答案:

答案 0 :(得分:1)

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

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

您可以在annotations.file_cache_reader

找到symfony/src/Symfony/Bundle/FrameworkBundle/Resources/config/annotations.xml的定义

有关服务覆盖here的更多信息。

答案 1 :(得分:0)

在读取我自己的代码到过去的片段时,我意识到我正在使用Symfony annotation_reader服务,实际上是FileCacheReader类,除非使用debug参数初始化为true,否则不会跟踪更改在课堂里。

因为我不能(我认为)[编辑:我可以按照@rolebi的说法]覆盖Symfony如何实例化这个服务,我不想创建一个基本的AnnotationReader并向其注册Annotations。我决定'手动'删除相关的缓存文件。

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'

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