Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony2/Doctrine2尝试生成实体时出现无效映射文件异常_Php_Symfony_Doctrine Orm_Mappingexception - Fatal编程技术网

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

Php Symfony2/Doctrine2尝试生成实体时出现无效映射文件异常,php,symfony,doctrine-orm,mappingexception,Php,Symfony,Doctrine Orm,Mappingexception,我有一个非常简单的数据库,我正试图从中导入和创建实体。条令(Symfony)能够从数据库生成YML映射文件。但当我再次尝试生成实体时,我得到以下错误: [Doctrine\Common\Persistence\Mapping\MappingException] Invalid mapping file 'SandboxBundle.Entity.Product.orm.yml' for class 'SandboxBundle\Entity\Product'. yml文件在我看来很好,因为我们

我有一个非常简单的数据库,我正试图从中导入和创建实体。条令(Symfony)能够从数据库生成YML映射文件。但当我再次尝试生成实体时,我得到以下错误:

[Doctrine\Common\Persistence\Mapping\MappingException]
Invalid mapping file 'SandboxBundle.Entity.Product.orm.yml' for class
'SandboxBundle\Entity\Product'.
yml文件在我看来很好,因为我们认为它是由条令生成的。为了确定这一点,我用一个在线的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文件。错误发生在产品上,但我认为这是因为产品是先处理的

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: {  }
我在web上搜索了与诊断映射异常有关的任何资源,但没有找到任何资源。我假设YML文件中有某种东西导致实体生成器阻塞。但是错误消息并没有说明这可能是什么。我看到有很多关于堆栈溢出的此类问题的实例。如果能够获得有关如何诊断这些类型错误的信息,从而能够自己解决这些问题,那将是一件非常棒的事情。

中描述了:

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

因此,请尝试更改产品yaml定义,如下所示:

SandboxBundle\Entity\Product:
  type: entity
  table: product
    indexes:
  .....
在其他映射文件中执行相同操作

希望对您有所帮助

使用

php应用程序/控制台原则:生成:实体

根据条令自动生成实体。 你用过

app/console原则:生成:实体entityName

我是说

app/console生成:条令:实体entityName

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

我的建议是:

  • 删除现有实体
  • 使用适当的命令再次生成它们 尝试重命名该文件

    SandboxBundle.Entity.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'.
    

    祝你好运:)

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

    //bootstrap.php
    $config = Setup::createYAMLMetadataConfiguration(array(__DIR__ . 
    "/../config/dcm"), $isDevMode);
    
    使用Symfony Yaml 2。*,一切正常。但是使用Symfony Yaml^3.3,我会得到无效映射文件异常。我追溯到不同的Yaml库解析函数是如何工作的。当使用条令解析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;
    

    Don,这不是一个解决方案,但您可以选择运行“生成实体”“使用“verbose”选项的命令。这将为您提供一个PHP堆栈转储,然后您可以开始深入研究条令代码,至少看看失败的地方。但是,我建议,如果您要开始在供应商代码中四处搜索,添加诊断性的“print_”语句等,那么您可以在专门为此目的创建的Symfony测试实例中执行此操作。这就是我所做的。不,即使我添加了完全限定名,仍然会得到相同的错误。正如我所说,这些YML文件是由条令生成的。但是谢谢你的努力。
    $config = self::createConfiguration($isDevMode, $proxyDir, $cache);
    $config->setMetadataDriverImpl(new \MyNamespace\YamlDriver($paths));
    
    return $config;