У меня есть очень простая база данных, из которой я пытаюсь импортировать и создавать сущности. 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 есть что-то, что заставляет генератор сущностей задыхаться. Но сообщение об ошибке не указывает, что это может быть. Я вижу, что есть много случаев такого рода вопросов о переполнении стека. Было бы здорово получить информацию о том, КАК диагностировать эти типы ошибок, и таким образом иметь возможность выяснить это для себя.
Описал в доктор:
Имена классов, указанные в файлах YAML, должны быть полностью уточнены.
Поэтому попробуйте изменить определение yaml продукта следующим образом:
SandboxBundle\Entity\Product:
type: entity
table: product
indexes:
.....
Сделайте то же самое в других файлах сопоставления.
Надеюсь это поможет
Попробуйте переименовать файл
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'.
Удачи 🙂
Недавно у меня возникли похожие исключения «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;
использование
php app/console doctrine:generate:entity
создать сущность автоматически по доктрине.
Вы использовали
app/console doctrine:generate:entities entityName
Я имею в виду
app/console generate:doctrine:entities entityName
(обратите внимание на множественное слово «сущности») Ваша команда состоит в том, чтобы сгенерировать обновленное свойство существующей сущности и сгенерировать его методы получения и установки, но не для создания сущности.
Мое предложение: