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 验证器对其进行了检查,该验证器说没问题。我用来尝试生成实体的命令是:

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: {  }

为了完整起见,这里是 Category 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 上有很多此类问题的实例。获得有关如何诊断这些类型的错误的信息会很棒,因此能够自己解决。

4

4 回答 4

10

已在文档中描述:

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

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

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

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

希望这有帮助

于 2015-04-04T12:08:45.613 回答
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'.

祝你好运 :)

于 2017-04-12T18:11:30.373 回答
1

利用

php app/console doctrine:generate:entity

通过学说自动生成实体。你用过

app/console doctrine:generate:entities entityName

我是说

app/console generate:doctrine:entities entityName

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

我的建议是:

  1. 删除现有实体
  2. 使用正确的命令再次生成它们。
于 2015-04-05T18:42:43.200 回答
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;
于 2017-08-04T13:54:03.040 回答