【问题标题】:Symfony2/Doctrine2 Invalid Mapping File Exception when trying to generate entitiesSymfony2/Doctrine2 尝试生成实体时出现无效的映射文件异常
【发布时间】:2015-04-03 18:35:47
【问题描述】:

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

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

yml 文件对我来说看起来不错,正如我们所期望的那样,它是由 Doctrine 生成的。可以肯定的是,我对照一个在线 yml 验证器对其进行了检查,该验证器说没问题。我用来尝试生成实体的命令是:

app/console generate:doctrine:entities sandbox

.yml 文件紧随其后。请原谅由于在此处粘贴文件而导致的任何 yml 间距错误。正如我所说的,yml 文件是由学说生成的,并且确实通过了在线验证。

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 文件。错误出现在 Product 上,但我认为是因为先处理了 Product。

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 上有很多此类问题的实例。获得有关如何诊断这些类型的错误的信息,这样我们就可以自己解决问题了。

【问题讨论】:

  • 唐,这不是一个解决方案,但您可以选择使用“详细”选项运行“生成实体”命令。这将为您提供 PHP 堆栈转储,然后您可以开始深入研究 Doctrine 代码,至少看看有什么问题。但是,我建议,如果您要开始在供应商代码中四处寻找,添加诊断“print_”语句等,请在您专门为此目的创建的 Symfony 测试实例。这就是我所做的。

标签: php symfony doctrine-orm mappingexception


【解决方案1】:

doc中有描述:

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

所以尝试更改产品 yaml 定义如下:

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

在其他映射文件中执行相同操作。

希望有帮助

【讨论】:

  • 不,即使我添加了完全限定名称,仍然出现同样的错误。正如我所说,这些 YML 文件是由 Doctrine 生成的。但是感谢您的努力。
【解决方案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'.

祝你好运:)

【讨论】:

    【解决方案3】:

    最近我使用以下代码遇到了类似的“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;
    

    【讨论】:

      【解决方案4】:

      使用

      php app/console doctrine:generate:entity

      根据教义自动生成实体。 你用过

      app/console doctrine:generate:entities entityName

      我是说

      app/console generate:doctrine:entities entityName

      (注意复数“实体”一词)您的命令是生成现有实体的更新属性并生成其 getter 和 setter 方法,但不生成实体。

      我的建议是:

      1. 删除现有实体
      2. 使用正确的命令再次生成它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-02
        • 2016-12-24
        • 1970-01-01
        • 2013-12-18
        • 1970-01-01
        相关资源
        最近更新 更多