我可以将Doctrine实体或其映射文件组织到子文件夹中吗?

And*_*kin 9 yaml symfony doctrine-orm

我已经为我的映射文件尝试了这个目录结构:

/config/doctrine/Place.orm.yml
/config/doctrine/Place/Type.orm.yml
/config/doctrine/Place/Price.orm.yml
Run Code Online (Sandbox Code Playgroud)

并在我的映射文件中指向了相应的实体,如下所示:

Project\TestBundle\Entity\Place\Type:
  type: entity
  table: place_type
  id:
    id:
      type: integer
      generator: { strategy:AUTO }
  fields:
    name:
      type: string
      length: 255
Run Code Online (Sandbox Code Playgroud)

但这会返回错误.系统似乎无法检测到Entity的映射文件.

Tom*_*ski 16

长话短说,这是可能的.

如果您的bundle的Entity文件夹中有文件夹结构,那很简单.您必须使用Entity命名空间下面的实体命名空间部分命名您的ORM文件并替换\..

因此,例如,如果您有Project\TestBundle\Entity\Place\Type实体,则ORM文件(位于config/doctrine包内的文件夹中)将具有名称Place.Type.orm.yml.

如果你想从Entity文件夹之外(甚至在bundle文件夹之外)使用Doctrine实体类,它会有点复杂,但仍然可能.Doctrine Bundle允许在其配置中为您的类定义自定义映射位置.

再说一遍 - 例子.如果您的实体位于Project\Test命名空间(在文件夹中src/Project/Test),您可以像这样定义映射:

应用程序/配置/配置*.yml

doctrine:
  orm:
    MyCustomDomain:
          mapping:              true
          type:                 yml
          dir:                  %kernel.root_dir%/config/projecttest
          alias:                ProjectTest
          prefix:               Project\Test
          is_bundle:            false
Run Code Online (Sandbox Code Playgroud)

实际上,Doctrine Bundle会自动执行类似的操作,这就是为什么您可以将所有类放在Entity子文件夹中而不再担心的原因.

前缀是名称空间前缀.Folder是包含配置文件的文件夹的路径.别名很有趣 - 它允许在DQL查询和映射文件中使用更简单的对象名称.Symfony的TestBundle:Test语法在同一个前提下工作 - TestBundle是TestBundle中所有实体的别名.is_bundle告诉Doctrine,这些实体不在Symfony捆绑中,需要一些不同的处理方法.

在定义自己的映射时有一些注意事项.Mapper使用前缀上的"第一个匹配"规则.因此,如果您在太宽的名称空间前缀上声明映射,它可以覆盖其他映射.

然而,它有时是有用的.例如,如果要将"外部"库中的类直接映射到Doctrine.或者正在创建一个与Symfony不完全绑定的库,并希望将一些类保留在bundle之外.


Chr*_*ris 6

如果要将学说实体组织到子文件夹中

例如: src/AppBundle/Entity/subfolder/MyEntity.php

然后相应的ORM文件应如下所示:

src/Resources/config/Doctrine/subfolder.MyEntity.orm.yml

不要在里面制作子文件夹src/Resources/config/Doctrine/*

*注意:如果您查看Doctrine配置文档,看起来可以使用以下命令为orm.yml文件配置不同的位置:

doctrine:
      orm:
        # An array of mappings, which may be a bundle name or     something else
        mapping_name:
              mapping:              true
              type:                 ~
              dir:                  ~
              alias:                ~
              prefix:               ~
              is_bundle:            ~
Run Code Online (Sandbox Code Playgroud)

但我没试过这个.也许其他人可以确认改善这个答案?