Symfony2/Doctrine2尝试生成实体时出现无效的映射文件异常

6

我有一个非常简单的数据库,想要将其导入并创建实体。Doctrine (Symfony) 能够从数据库生成 YML 映射文件。但是当我随后尝试生成实体时,会出现以下错误:

[Doctrine\Common\Persistence\Mapping\MappingException]
Invalid mapping file 'SandboxBundle.Entity.Product.orm.yml' for class
'SandboxBundle\Entity\Product'.

我认为yml文件看起来很好,因为它是由Doctrine生成的,这是我们所希望的。为了确保,我使用在线yml验证器检查了它,结果显示它是OK的。我尝试生成实体的命令是:

app/console generate:doctrine:entities sandbox

以下是.yml文件。请原谅任何由于将文件粘贴到此处而导致的yml空格错误。正如我所说,这些yml文件是由doctrine生成的,并且已经通过在线验证。

Product:
  type: entity
  table: product
    indexes:
      category_id:
          columns:
              - category_id
  id:
      id:
          type: integer
          nullable: false
          unsigned: false
          comment: ''
          id: true
          generator:
              strategy: IDENTITY
  fields:
      productname:
          type: string
          nullable: true
          length: 10
          fixed: false
          comment: ''
      categoryId:
          type: integer
          nullable: true
          unsigned: false
          comment: ''
          column: category_id
 lifecycleCallbacks: {  }

为了完整起见,这是类别yml文件。错误发生在产品上,但我认为这是因为产品首先被处理。

Category:
   type: entity
   table: category
       id:
          id:
              type: integer
              nullable: false
              unsigned: false
              comment: ''
              id: true
              generator:
                  strategy: IDENTITY
      fields:
          categoryname:
              type: string
              nullable: true
              length: 50
              fixed: false
              comment: ''
      lifecycleCallbacks: {  }

我在网上搜索了与诊断映射异常有关的任何资源,但没有找到。我认为是YML文件中的某些内容导致实体生成器出现了问题。但是错误消息并没有给出任何指示。我看到Stack Overflow上有很多这种问题的实例。获取有关如何诊断这些类型错误的信息将非常有帮助,从而能够自己找到解决方法。


Don,这不是一个解决方案,但你可以选择使用“verbose”选项运行你的“generate entities”命令。这将为你提供一个PHP堆栈转储,然后你可以开始挖掘Doctrine代码,至少看看哪里出了问题。然而,我建议如果你要开始在供应商代码中添加诊断“print_”语句等,那么最好在你专门为此目的创建的Symfony测试实例中进行。这就是我所做的。 - Don Briggs
4个回答

10

文档中所述:

在YAML文件中指定的类名应该是完全限定的。

因此,请尝试将产品YAML定义更改为以下内容:

SandboxBundle\Entity\Product:
  type: entity
  table: product
    indexes:
  .....

在其他映射文件中也要执行同样的操作。

希望这能有所帮助。


不行,即使我添加了完全限定名称,仍然出现相同的错误。就像我说的,这些YML文件是由Doctrine生成的。但还是谢谢你的努力。 - Don Briggs

2
尝试重命名文件。
SandboxBundle.Entity.Product.orm.yml

为了

Product.orm.yml

并确保在YAML中完全限定您的名称

SandboxBundle\Entity\Product:
type: entity
table: product
indexes:
.....

可能会因为双重命名空间而出现错误。Symfony将文件的点部分添加到命名空间中。

[Doctrine\Common\Persistence\Mapping\MappingException]
Invalid mapping file 'SandboxBundle.Entity.SandboxBundle.Entity.Product.orm.yml' for class
'SandboxBundle\Entity\SandboxBundle\Entity\Product'.

祝你好运 :)


1
请使用以下命令自动生成Doctrine实体:php app/console doctrine:generate:entity。您已经使用了app/console doctrine:generate:entities entityName命令,我想说的是app/console generate:doctrine:entities entityName(注意复数的“entities”单词)。您的命令是生成现有实体的更新属性,并生成其getter和setter方法,但不是生成实体。我的建议是:1.删除现有实体;2.使用正确的命令重新生成它们。

1

最近我使用以下代码时遇到了类似的“MappingException:Invalid mapping file”异常:

//bootstrap.php
$config = Setup::createYAMLMetadataConfiguration(array(__DIR__ . 
"/../config/dcm"), $isDevMode);

使用 Symfony Yaml 2.* 版本时,一切都正常。但是使用 Symfony Yaml ^3.3 版本时,会出现无效的映射文件异常。我追踪了不同的 Yaml 库解析函数的工作方式。当使用 Doctrine 解析 yaml 文件时,它将使用 YamlDriver 类加载 yaml 文件,并使用此函数:
// vendor/doctrine/orm/lib/Doctrine/Orm/Mapping/Driver/YamlDriver.php
protected function loadMappingFile($file)
{
    return Yaml::parse($file);
}

在Yaml 2.*中,将文件名字符串传递给解析器可以正常工作,但是在Yaml ^3.3中,解析函数需要一个yaml字符串。一些解决方法包括使用xml配置文件或编写自己的Yaml驱动程序,并通过绕过Setup::createYAMLMetadataConfiguration来获取配置,使用以下代码:
$config = self::createConfiguration($isDevMode, $proxyDir, $cache);
$config->setMetadataDriverImpl(new \MyNamespace\YamlDriver($paths));

return $config;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接