【问题标题】:Symfony2 - Sharing users between multiple applicationsSymfony2 - 在多个应用程序之间共享用户
【发布时间】:2017-04-12 09:26:22
【问题描述】:

我目前正在为我们的一位客户寻找一种在多个 Symfony2 应用程序之间共享用户的方法。在过去的 3 年中,我们为他们制作了一些应用程序 (4),它们具有不同的目的,但始终使用“相同”的用户模型和数据。

目前,我们有 4 个独立的数据库,其中的“用户”表在所有应用程序上都差不多,除了多对多关系。起初,我正在考虑添加第二个实体管理器(和连接),并将用户放在单独的数据库中。所有应用程序都可以使用它,并且所有用户都将拥有相同的凭据。但是如何处理多对多关系呢?

举个例子,在应用程序 A 上,您有一个从“用户”到“客户”的多对多关系,但应用程序 B/C/D 中不存在“客户”表。在应用程序 B 上,您有从“用户”到“供应商”的多对多关系,但应用程序 A/C/D 等中不存在“供应商”表。将“客户”或“供应商”表移动到共享数据库也不是一个真正的选择,因为其他实体(未共享)也与这些表有关系。

我基本上需要找到一种方法来映射“共享用户”模型/数据库上的多对多关系,这些关系对于每个应用程序都是唯一的。有没有办法通过多个数据库实现这一点?我应该采取其他方法吗?

欢迎提供所有信息。提前致谢。

【问题讨论】:

  • 我认为的第一件事是,使用 Doctrine 的关系映射不是强制性的,它仅用于数据库关系。您还可以在实体内手动填充数组。大多数情况下,您需要将 UserManager(或 UserHelper)类添加到服务容器中。然后你可以做类似 $user = userHelper->loadByUsername($username);或 userHelper->update($user);

标签: php database symfony database-design fosuserbundle


【解决方案1】:

选项 1

使用不同的连接,这在 Doctrine 开箱即用的情况下似乎是不可能的。

已经回答了类似的问题:

如第一个答案所述,您可以执行以下操作:

通过保存相关对象的标识符(旧样式)而不是对它们的引用来保持对象图的断开,然后通过服务手动获取对象。

但是,如果您希望 Doctrine 真正了解关联,则需要将关联的实体持久保存在同一数据库中,否则您的映射只会产生错误。这意味着您需要复制 User 实体。

选项 2

在非常特殊的情况下,您可以使用相同的连接(即在同一主机上使用同一 DBMS 的多个数据库并使用同一用户),似乎有一种方法,但我还没有测试过它: https://techpunch.co.uk/development/using-multiple-databases-with-symfony2-and-doctrine2

这个想法是在每个表前面加上数据库名称,就好像它是一个模式名称一样,像这样:

这个实体被映射到数据库«users»中的«User»表:

<?php
namespace Demo\UserBundle\Entity;
use DoctrineORMMapping as ORM;

/**
 * @ORMTable(name="users.User")
 */
class User
{
  /* ... */
}

这个映射到数据库«posts»中的«Post»表:

<?php
namespace Demo\PostBundle\Entity;
use DoctrineORMMapping as ORM;

/**
 * @ORMTable(name="posts.Post")
 */
class Post
{
  /* ... */
}

然后你可以像往常一样进行关联:

class Post
{
    /**
     * @ORM\ManyToOne(targetEntity="\Demo\UserBundle\Entity\User")
     **/
    private $user;
    /* ... */
}

作者还链接到github上的一个示例项目: https://github.com/lobsterdore/symfony2-multiple-db-example

【讨论】:

  • 为最后一个链接点赞;刚刚在本地试用过,效果很好。所有应用程序当前都在同一台服务器上,所以它绝对是现在可以工作的东西。我唯一担心的是我们能够将它们全部保存在同一台服务器上多久,因为有可能有一天一些应用程序会“全球化”,每个平台都有大量用户,但这是另一个问题 :-) 感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 2019-10-12
相关资源
最近更新 更多