Множественная реализация Доктрины - PullRequest
0 голосов
/ 07 января 2019

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

1 Ответ

0 голосов
/ 08 января 2019

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

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

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

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

Редактировать: я отмечу этот ответ как Принятый, как только смогу.

...