我有一个带有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.
。
我不知道我是否在这里遗漏了一些东西,这是第一次尝试这样的方法。
任何提示?提前谢谢。
答案 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'
更改后清除缓存。
必须引用包含以下任何字符的字符串。 虽然您可以使用双引号,但对于这些字符,它更多 方便使用单引号,避免任何逃脱 反斜杠。
:,{,},[,] ,,,&,*,#,?,|, - ,<,>,=,!,%,@,`