Symfony4 如何通过Bundle实现多应用共享Entity与Repository
Symfony 4 跨应用共享实体解决方案
方案一:公共Bundle实现共享
要避免两个应用重复存储文件,需要将Bundle放在两个应用都能访问的公共位置,不要放在单个应用的src目录下,操作步骤如下:
- 调整Bundle存放路径:在项目根目录(和api、admin文件夹同级)新建
shared-bundles目录,把你编写的MyOrgBundle整个移动到该目录下,最终路径为项目根目录/shared-bundles/MyOrgBundle/ - 配置两个应用的composer自动加载规则:在api和admin应用的
composer.json的autoload.psr-4节点中添加配置"MyOrg\\MyOrgBundle\\": "../shared-bundles/MyOrgBundle/src/",添加完成后执行composer dump-autoload - 两个应用都在
config/bundles.php中注册该Bundle:MyOrg\MyOrgBundle\MyOrgBundle::class => ['all' => true] - 配置Doctrine识别Bundle内的实体:在两个应用的
config/packages/doctrine.yaml的mappings节点添加如下配置:
MyOrgBundle: is_bundle: true type: annotation # 如果使用PHP属性映射则改为attribute dir: 'Entity' prefix: 'MyOrg\MyOrgBundle\Entity' alias: MyOrg
后续所有共享实体都写入Bundle的Entity目录即可,两个应用可直接调用。
方案二:直接共享实体目录(你当前尝试的方案)
你当前配置未生效有两个核心原因:
make:entity命令默认只会将实体生成在当前应用的src/Entity目录下,它不会读取你自定义的mapping路径,这是MakerBundle的默认限制,并非你的配置错误- 你配置的prefix是
App\Entity,需要保证存放在../share/Entity中的实体命名空间也对应为App\Entity,同时需要在两个应用的composer.json中配置自动加载规则,否则Symfony无法识别该路径下的类,需要在autoload.psr-4节点添加"App\\Entity\\": "../share/Entity/",添加后执行composer dump-autoload
报错处理
你遇到的make:entity报错就是因为MakerBundle默认匹配应用内App\Entity命名空间对应的目录,如果你要使用该方案,建议不要用make:entity直接生成实体,手动在share/Entity目录下编写实体代码,或者先在单个应用的src/Entity目录生成后移动到共享目录,再执行php bin/console make:entity --regenerate生成getter、setter方法即可避免报错。
内容的提问来源于stack exchange,提问作者MMMWeirdo
相关产品推荐
相关产品推荐

