Множественная реализация доктрины

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
0
101
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я чувствую себя тупым после того, как исправил это сам ...

Это были параметры dir в конфигурации doctrine.mongodb.yaml. Он был установлен в папку моего класса, в то время как предполагалось, что это папка сопоставления.

С аннотацией это было хорошо, поскольку отображение находится внутри классов, но с XML - неправильно.

Поэтому я действительно не знаю, что означает передача пути сопоставления в методах DoctrineMongoDBMappingsPass::createXmlMappingDriver() (в первом параметре $arguments), но, похоже, вместо этого используются параметры dir.

Обновлено: я отмечу этот ответ как принятый, как только смогу.

Другие вопросы по теме