我正在创建一个应用程序是 symfony
(4.1),我想在一个单独的数据库中单独进行身份管理。
然后我按如下方式配置了 doctine
doctrine:
dbal:
default_connection: default
connections:
default:
url: '%env(DATABASE_URL)%'
driver: 'pdo_mysql'
mapping_types:
enum: string
identity:
url: '%env(IDENTITY_DATABASE_URL)%'
driver: 'pdo_pgsql'
orm:
default_entity_manager: default
entity_managers:
default:
connection: default
mappings:
App:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity'
prefix: 'App\Entity'
identity:
auto_mapping: true
connection: identity
mappings:
ACL:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity/Identity'
prefix: 'App\Entity\Identity'
在 contoller
中,我想从 identity 数据库中检索 users
。
有使用方法
$this->getDoctrine()->getRepository(User::class, 'identity')->findAll();
运行 php bin/console server:run
看起来下面的代码使用了default 数据库,而不是identity 数据库。
我是否遗漏了在 symfony
中启用分片的任何内容?
问候,
最佳答案
您必须注入(inject)适当的实体管理器(即身份)。对应的服务名称为“doctrine.orm.identit_entity_manager”。
如果你想在 Controller 中使用它,我建议将此服务绑定(bind)为 services.yaml 中的参数:
App\Controller\FooController:
bind:
$identityManager: '@doctrine.orm.identity_entity_manager'
然后在你的 Controller 中通过 Autowiring 注入(inject)它并按预期使用它:
class FooController extends AbstractController {
/**
* @Route("/bar", name="bar")
*/
public function bar($identityManager) {
...
$identityManager->getRepository(User::class)->findAll();
...
}
我已经从 github 下载并运行了你的项目。事实证明,正如我在评论中已经注意到的那样,问题出在 doctrine.yaml 中实体管理器的错误配置。为了让你的程序正确工作(对我来说是这样),你创建了两个新目录(/src/Entity/First,/src/Entity/Second),将文件 First.php 和 Second.php 分别放在这些目录中,然后将 doctrine.yaml 中的配置更改为
doctrine:
dbal:
default_connection: default
connections:
default:
url: '%env(DATABASE_URL)%'
driver: 'pdo_mysql'
server_version: '5.7'
charset: utf8mb4
second:
url: '%env(SECOND_DATABASE_URL)%'
driver: 'pdo_mysql'
server_version: '5.7'
charset: utf8mb4
orm:
default_entity_manager: default
entity_managers:
default:
connection: default
mappings:
Main:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity/First'
prefix: 'App\Entity\First'
alias: First
second:
connection: second
mappings:
Second:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity/Second'
prefix: 'App\Entity\Second'
alias: Second
一切顺利。
问题是您将两个实体管理器配置为处理相同的实体(通过 orm 部分中的“dir”和“prefix”选项)。这导致了与不可预测行为的冲突。事实上,由于这种冲突,它是第一个在第二类的存储库中调用的实体管理器。
关于mysql - symfony 4 中的独立数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52096949/