symfony4中的独立数据库

vmdwslir  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(393)

我正在创建一个应用程序 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 ,我想找回 users 从身份数据库。
有方法在用

$this->getDoctrine()->getRepository(User::class, 'identity')->findAll();

跑步 php bin/console server:run 下面的代码似乎使用默认数据库,而不是标识数据库。
我错过了什么可以让切分的东西吗 symfony ?
当做,

gcuhipw9

gcuhipw91#

必须注入适当的实体管理器(即标识)。相应的服务名称是“条令.orm.identit\u实体\u管理器”。
如果您想在控制器中使用它,我建议将此服务绑定为services.yaml中的参数:

App\Controller\FooController:
        bind:
            $identityManager: '@doctrine.orm.identity_entity_manager'

然后在您的控制器中,只需通过自动布线将其注入并按预期使用即可:

class FooController extends AbstractController {

/**
 * @Route("/bar", name="bar")
 */
public function bar($identityManager) {
    ...
    $identityManager->getRepository(User::class)->findAll();
    ...
}

我已经从github下载并运行了你的项目。事实证明,正如我在评论中已经注意到的那样,问题是document.yaml中实体管理器的配置不好。为了让你的程序正常工作(对我来说是这样的),你需要创建两个新目录(/src/entity/first,/src/entity/second),将文件first.php和second.php分别放在这些目录中,然后将doctor.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”选项)。这导致了与不可预测行为的冲突。实际上,由于这种冲突,在第二个类的存储库中调用的是第一个实体管理器。

相关问题