Исключение из-за недопустимого файла сопоставления Symfony2 / Doctrine2 при создании объектов

У меня есть очень простая база данных, из которой я пытаюсь импортировать и создавать сущности. 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. Ошибка была на товаре, но я предполагаю, что это потому, что товар был обработан первым.

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 есть что-то, что заставляет генератор сущностей задыхаться. Но сообщение об ошибке не указывает, что это может быть. Я вижу, что есть много случаев такого рода вопросов о переполнении стека. Было бы здорово получить информацию о том, КАК диагностировать эти типы ошибок, и таким образом иметь возможность выяснить это для себя.

6

Решение

Описал в доктор:

Имена классов, указанные в файлах YAML, должны быть полностью уточнены.

Поэтому попробуйте изменить определение yaml продукта следующим образом:

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

Сделайте то же самое в других файлах сопоставления.

Надеюсь это поможет

10

Другие решения

Попробуйте переименовать файл

SandboxBundle.Entity.Product.orm.yml

в

Product.orm.yml

и убедитесь, что полностью указали свое имя в ямле

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

Удачи 🙂

2

Недавно у меня возникли похожие исключения «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 функция parse ожидает строку yaml. Некоторые способы обойти это включают использование конфигурационных файлов xml или написание собственного драйвера Yaml и получение конфигурации, минуя Setup :: createYAMLMetadataConfiguration и используя этот код:

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

return $config;
1

использование

php app/console doctrine:generate:entity

создать сущность автоматически по доктрине.
Вы использовали

app/console doctrine:generate:entities entityName

Я имею в виду

app/console generate:doctrine:entities entityName

(обратите внимание на множественное слово «сущности») Ваша команда состоит в том, чтобы сгенерировать обновленное свойство существующей сущности и сгенерировать его методы получения и установки, но не для создания сущности.

Мое предложение:

  1. Удалить существующую сущность
  2. Сгенерируйте их снова, используя правильную команду.
1
По вопросам рекламы [email protected]