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

时间:2014-01-08 14:38:27

标签: symfony doctrine-orm yaml

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

/config/doctrine/Place.orm.yml
/config/doctrine/Place/Type.orm.yml
/config/doctrine/Place/Price.orm.yml

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

Project\TestBundle\Entity\Place\Type:
  type: entity
  table: place_type
  id:
    id:
      type: integer
      generator: { strategy:AUTO }
  fields:
    name:
      type: string
      length: 255

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

3 个答案:

答案 0 :(得分:15)

长话短说,这是可能的。

如果您的捆绑包的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

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

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

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

尽管如此,它有时很有用。例如,如果您想要映射来自" foreign"库直接到Doctrine。或者正在创建一个与Symfony不完全绑定的库,并希望将一些类保留在bundle之外。

答案 1 :(得分:6)

如果您想将学说实体组织成子文件夹

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

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

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

不要在src/Resources/config/Doctrine/ *

中创建子文件夹

*注意:如果你看一下Doctrine config docs,看起来可以使用以下命令为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:            ~

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

答案 2 :(得分:0)

使用@ORM 注释,您只需要::class, 这是示例:

/**
 * @ORM\ManyToOne(targetEntity=User::class)
 */
private User $accountant;

不要忘记像这样导入用户

use App\Entity\Subfolder\User;