Symfony和Doctrine:映射生活在bundle之外的实体

时间:2016-10-30 17:14:23

标签: php symfony doctrine-orm doctrine

我有一个带有DDD风格的symfony项目,我正在尝试使用doctrine和yml映射我的域实体。

我的(相关)文件夹结构如下:

src/
|_ Vendor/
    |_ Project/
       |_ Application/
       |_ Domain/
       |  |_ Model/
       |     |_ User/
       |        |_ User.php # entity
       |        |_ UserId.php # value object
       |        |_ Username.php # value object
       |_ Infrastructure/
          |_ AppBundle/
             |_ Resources/
                |_ config/
                   |_ doctrine/
                      |_ user.yml

我的user.yml文件是这样的:

User\User:
    type: entity
    table: user
    id:
        UserId:
            type: User\UserId
            column: id
    fields:
        username:
            type: User\Username
            column: username

在我的config.yml文件中,我有这个:

# Doctrine Configuration
doctrine:
    dbal:
        driver:   pdo_mysql
        host:     "%database_host%"
        port:     "%database_port%"
        dbname:   "%database_name%"
        user:     "%database_user%"
        password: "%database_password%"
        charset:  UTF8

    orm:
        auto_generate_proxy_classes: "%kernel.debug%"
        default_entity_manager: default
        entity_managers:
            default:
                mappings:
                    domain:
                        type: yml
                        dir: "%kernel.root_dir%/../src/Vendor/Project/Infrastructure/AppBundle/Resources/config/doctrine"
                        is_bundle: false
                        prefix: Vendor\Project\Domain\Model
                        alias: Domain

无论我尝试什么,任何学说操作,如Symfony的php bin/console doctrine:schema:create --dump-sql都会返回No Metadata Classes to process.

我不知道我是否在这里遗漏了一些东西,这是第一次尝试这样的方法。

任何提示?提前谢谢。

2 个答案:

答案 0 :(得分:2)

好的,经过一段时间的试验和错误,工作配置是这样的:

src/
|_ Vendor/
    |_ Project/
       |_ Application/
       |_ Domain/
       |  |_ Model/
       |     |_ User/
       |        |_ User.php # entity
       |        |_ UserId.php # value object
       |        |_ Username.php # value object
       |_ Infrastructure/
          |_ AppBundle/
             |_ Resources/
                |_ config/
                   |_ doctrine/
                      |_ User.User.orm.yml # namespace AFTER prefix from config.yml

User.User.orm.yml:#完整名称空间

Vendor\Project\Domain\Model\User\User:
    type: entity
    table: user
    id:
        id: # name is not anymore the name of the VO
            type: Vendor\Project\Domain\Model\User\UserId
            column: id
    fields:
        username:
            type: Vendor\Project\Domain\Model\User\Username
            column: username

config.yml:

orm:
    auto_generate_proxy_classes: "%kernel.debug%"
    default_entity_manager: default
    entity_managers:
        default:
            auto_mapping: false
            mappings:
                domain:
                    type: yml
                    dir: "%kernel.root_dir%/../src/Vendor/Project/Infrastructure/AppBundle/Resources/config/doctrine"
                    is_bundle: false
                    prefix: "Vendor\\Project\\Domain\\Model"
                    alias: Model

基本上,映射文件名必须遵循.orm.yml扩展名的约定,并且必须实现FQCN的最后部分(config.yml中prefix:未涵盖的部分。

此外,在映射文件中,类型必须是FQCN。

希望这可以帮助任何有同样问题的人。

编辑:感谢nifr获取帮助

答案 1 :(得分:0)

您的配置存在4个问题:

  • 映射文件应该命名为User.orm.yml(大写)
  • 映射文件本身应以Vendor\Project\Domain\Model而不是User\User
  • 开头
  • 表名需要使用反引号进行转义或更改,因为user是SQL中的保留关键字 - table: users
  • prefix中命名空间中的反斜杠需要加倍(\\)或用单引号括起来: prefix: 'Vendor\Project\Domain\Model'

更改后清除缓存。

来自YAML Documentation

  

必须引用包含以下任何字符的字符串。   虽然您可以使用双引号,但对于这些字符,它更多   方便使用单引号,避免任何逃脱   反斜杠。

     

:,{,},[,] ,,,&,*,#,?,|, - ,<,>,=,!,%,@,`