Я использую 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
не найдены.