我已经为我的映射文件尝试了这种目录结构:
/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;