Symfony2/Doctrine2 Invalid Mapping File Exception

2019-04-29 00:38发布

问题:

I have a very simple database that I am trying to import, and create Entities from. Doctrine (Symfony) is able to generate the YML mapping files from the database. But when I subsiquently try to generate entities, I get the following error:

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

The yml file looks fine to me, as we would expect being that it was generated by Doctrine. Just to be sure, I checked it against an online yml validator which said it was OK. The command I used to attempt to generate the entities was:

app/console generate:doctrine:entities sandbox

The .yml files follow. Please excuse any yml spacing errors that are a result of pasting the file here. As I said, the yml files were generated by doctrine, and did pass an online verification.

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

And for completeness, here is the Category yml file. The error was on Product, but I presume it is because Product was processed first.

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

I searched the web for any resources pertaining to diagnosing Mapping Exceptions, but have not found any. I presume that there is something in the YML files that is causing the entity generator to choke. But the error message give no indication as to what that might be. I see there are lots of instances of this kind of question on Stack Overflow. It would be great to get information on HOW to diagnose these types of errors, and thus be able to figure it out for ourselves.

回答1:

Has described in the doc:

class-names specified in the YAML files should be fully qualified.

So try change the product yaml definition as follow:

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

Do the same in the other mapping files.

Hope this help



回答2:

Try to rename the file

SandboxBundle.Entity.Product.orm.yml

to

Product.orm.yml

and make sure to fully qualify your name in the yaml

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

you might get an error because of double namespace. Symfony adds the dotted part of the file to the namespace.

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

Good luck :)



回答3:

Recently I was experiencing similar "MappingException: Invalid mapping file" exceptions using the following code:

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

Using Symfony Yaml 2.*, everything worked fine. But with Symfony Yaml ^3.3 I would get the invalid mapping file exception. I traced it to how the different Yaml library parse functions work. When using Doctrine to parse yaml files, it will use the YamlDriver class which loads yaml files using this function:

// vendor/doctrine/orm/lib/Doctrine/Orm/Mapping/Driver/YamlDriver.php
protected function loadMappingFile($file)
{
    return Yaml::parse($file);
}

In Yaml 2.*, passing a filename string to parse works without problem, but with Yaml ^3.3, the parse function expects a yaml string. Some ways to get around this include using xml config files or writing your own Yaml driver and obtaining the config by bypassing the Setup::createYAMLMetadataConfiguration and using the this code:

$config = self::createConfiguration($isDevMode, $proxyDir, $cache);
$config->setMetadataDriverImpl(new \MyNamespace\YamlDriver($paths));

return $config;


回答4:

Use

php app/console doctrine:generate:entity

to generate an entity automatically by doctrine. You have used

app/console doctrine:generate:entities entityName

I mean

app/console generate:doctrine:entities entityName

(notice the plural "entities" word)Your command is to generate the updated property of an existing entity and to generate his getter and setter methods but not to generate an entity.

My suggestion is:

  1. Delete the existing entity
  2. Generate them again using proper command.