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



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

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

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

ProjectTestBundleEntityPlaceType:
type: entity
table: place_type
id:
id:
type: integer
generator: { strategy:AUTO }
fields:
name:
type: string
length: 255

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

长话短说,这是可能的。

如果您在捆绑包的Entity文件夹中有文件夹结构,这很简单。您必须使用实体名称空间下面的实体名称空间部分命名ORM文件,并将替换为.

因此,例如,如果您有ProjectTestBundleEntityPlaceType实体,那么ORM文件(位于捆绑包中的config/doctrine文件夹中)的名称将为Place.Type.orm.yml

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

再举一个例子。如果您的实体位于ProjectTest命名空间内(在文件夹src/Project/Test中),则可以定义如下映射:

app/config/config*.yml

doctrine:
orm:
MyCustomDomain:
mapping:              true
type:                 yml
dir:                  %kernel.root_dir%/config/projecttest
alias:                ProjectTest
prefix:               ProjectTest
is_bundle:            false

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

前缀是命名空间前缀。文件夹是指向包含配置文件的文件夹的路径。Alias很有趣,它允许在DQL查询和映射文件中使用更简单的对象名称。Symfony的TestBundle:Test语法在相同的前提下工作——TestBundle是TestBundle中所有实体的别名。is_bundle告诉Doctrine,实体在Symfony捆绑之外,需要一点不同的处理。

在定义自己的映射时有一些注意事项。映射器在前缀上使用"第一匹配"规则。所以,如果您在过于宽泛的名称空间前缀上声明映射,它可能会覆盖其他映射。

尽管如此,它有时还是有用的。例如,如果您想将"外来"库中的类直接映射到Doctrine。或者正在创建一个未完全绑定到Symfony的库,并希望将某些类保留在捆绑包之外。

如果您想将条令实体组织到子文件夹中

例如: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:            ~

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

使用@ORM注释,您只需要::class,这里有一个例子:

/**
* @ORMManyToOne(targetEntity=User::class)
*/
private User $accountant;

不要忘记像这个一样导入用户

use AppEntitySubfolderUser;

相关内容

  • 没有找到相关文章

最新更新