Я использую Symfony4 и Doctrine, и я хотел бы сделать свое приложение «совместимым» как с ODM, так и с ORM.
Для этого я изменил свои документы (изначально мое приложение было только ODM) на «общие модели» (перешел с App\Model\Documents на App\Model\Persistence) и пробую использовать XML Mapping.
Я изменил в конфигурационных файлах doctrine.yaml и doctrine_mongodb.yaml параметр сопоставления на xml.
Из таких примеров, как FosUserBundle и эта ссылка (это не для symfony4, но я не нашел похожей страницы для symfony4), я сделал это в моем Kernel
/**
* @param \Symfony\Component\DependencyInjection\ContainerBuilder $container
*/
protected function build(ContainerBuilder $container): void
{
$mappingsODM = array(
realpath(__DIR__.'/Model/Mapping/ODM') => 'App\Model\Persistence',
realpath(__DIR__.'/Model/Mapping/ODM/Files') => 'App\Model\Persistence\Files',
);
$mappingsORM = array(
realpath(__DIR__.'/Model/Mapping/ORM') => 'App\Model\Persistence',
realpath(__DIR__.'/Model/Mapping/ORM/Files') => 'App\Model\Persistence\Files',
);
if (class_exists('Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\DoctrineOrmMappingsPass')) {
$container->addCompilerPass(DoctrineOrmMappingsPass::createXmlMappingDriver($mappingsORM, [], 'app.backend_type_orm'));
}
if (class_exists('Doctrine\Bundle\MongoDBBundle\DependencyInjection\Compiler\DoctrineMongoDBMappingsPass')) {
$container->addCompilerPass(DoctrineMongoDBMappingsPass::createXmlMappingDriver($mappingsODM, [], 'app.backend_type_mongodb'));
}
//this CompilerPass is here to add my Repositories (ODM or ORM) in the ServiceContainer depending a param.
//$container->addCompilerPass(new DoctrineRepositoryCompilerPass());
}
При этом у меня есть следующее сообщение об исключении
No mapping file found named 'Chapter.mongodb.xml' for class 'App\Model\Persistence\Chapter'.
FQCN хорош, у меня есть файл сопоставлений в каталоге src/Model/Mapping/ODM (пока я только настроил ODM).
Как вы видели, в $mappingsODM я установил свою папку сопоставления => пространство имен, но затем, когда я загружаю свой репозиторий, у меня есть следующий дамп в переменной $driver (в MetadataFactory)
"FOS\UserBundle\Model" => XmlDriver {#59 ▼
#locator: SymfonyFileLocator {#58 ▼
#paths: array:1 [▼
0 => "/var/www/html/rapp/vendor/friendsofsymfony/user-bundle/Resources/config/doctrine-mapping"
]
#prefixes: array:1 [▼
"/var/www/html/rapp/vendor/friendsofsymfony/user-bundle/Resources/config/doctrine-mapping" => "FOS\UserBundle\Model"
]
#fileExtension: ".mongodb.xml"
-nsSeparator: "."
}
#classCache: null
#globalBasename: null
}
"App\Model\Persistence" => XmlDriver {#61 ▼
#locator: SymfonyFileLocator {#60 ▼
#paths: array:2 [▼
0 => "/var/www/html/rapp/src/Model/Mapping/ODM"
1 => "/var/www/html/rapp/src/Model/Mapping/ODM/Files"
]
#prefixes: array:2 [▼
"/var/www/html/rapp/src/Model/Mapping/ODM" => "App\Model\Persistence"
"/var/www/html/rapp/src/Model/Mapping/ODM/Files" => "App\Model\Persistence\Files"
]
#fileExtension: ".mongodb.xml"
-nsSeparator: "."
}
#classCache: null
#globalBasename: null
}
Я действительно не вижу никаких различий между частью FosUserBundle и моей (кроме пути к папке, конечно, но они хороши)
Я регулярно делаю php bin/console doctrine:mongodb:cache:clear-metadata, чтобы проверить, не испортился ли кеш, но ничего не меняется.
Вот один из моих файлов сопоставления xml в качестве примера
<?xml version = "1.0" encoding = "UTF-8"?>
<doctrine-mongo-mapping xmlns = "http://doctrine-project.org/schemas/odm/doctrine-mongo-mapping"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://doctrine-project.org/schemas/odm/doctrine-mongo-mapping
http://doctrine-project.org/schemas/odm/doctrine-mongo-mapping.xsd">
<document name = "App\Model\Persistence\Chapter" repository-class = "App\Model\ODM\Repository\ChapterRepository">
.... my fields
</document>
</doctrine-mongo-mapping>
Я что-то упускаю ? какие-то Kernel или CompilerPass я пропустил?
Редактировать :
В методе SymfonyFileLocator:findMappingFile() вот мой дамп $this->paths:
array:1 [▼
0 => "/var/www/html/rapp/src/Model/Persistence"
]
Это не моя папка сопоставления, а моя папка ModelClass. поэтому файлы сопоставления *.mongodb.xml не найдены.




Я чувствую себя тупым после того, как исправил это сам ...
Это были параметры dir в конфигурации doctrine.mongodb.yaml. Он был установлен в папку моего класса, в то время как предполагалось, что это папка сопоставления.
С аннотацией это было хорошо, поскольку отображение находится внутри классов, но с XML - неправильно.
Поэтому я действительно не знаю, что означает передача пути сопоставления в методах DoctrineMongoDBMappingsPass::createXmlMappingDriver() (в первом параметре $arguments), но, похоже, вместо этого используются параметры dir.
Обновлено: я отмечу этот ответ как принятый, как только смогу.