Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony2-在多个应用程序之间共享用户_Php_Database_Symfony_Database Design_Fosuserbundle - Fatal编程技术网

Php Symfony2-在多个应用程序之间共享用户

Php Symfony2-在多个应用程序之间共享用户,php,database,symfony,database-design,fosuserbundle,Php,Database,Symfony,Database Design,Fosuserbundle,我目前正在为我们的一位客户寻找一种在多个Symfony2应用程序之间共享用户的方法。在过去3年中,我们为他们制作了一些应用程序(4),它们有不同的用途,但总是使用“相同”的用户模型和数据 目前,我们有4个独立的数据库,其中“users”表在所有应用程序上都是相同的,除了多对多关系。起初,我考虑添加第二个实体管理器(和连接),并将用户放在单独的数据库中。所有的应用程序都可以使用它,所有的用户都有相同的凭证。但是我如何处理多对多关系呢 举个例子,在应用程序A上,您有一个从“用户”到“客户”的多对多关

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

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

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

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

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

选项1 使用不同的连接,这似乎不可能与开箱即用的原则

类似的问题已经得到了回答:

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

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

但是,如果您想让条令真正了解关联,则需要将关联的实体持久保存在同一数据库中,否则您的映射只会生成错误。这意味着您需要复制用户实体

选择2 在非常特殊的情况下,您可以使用相同的连接(即,在同一主机上,同一用户上具有相同DBMS的多个数据库),似乎有一种方法,但我没有测试它:

其思想是在每个表前面加上数据库名,就像它是一个模式名一样,如下所示:

该实体映射到数据库«用户»中的«用户»表:

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

/**
 * @ORMTable(name="users.User")
 */
class User
{
  /* ... */
}
作者还链接到github上的一个示例项目:

我认为第一件事是,不强制使用Doctrine的关系映射,该映射仅针对数据库关系设计。也可以在实体内手动填充数组。大多数情况下,您需要将UserManager(或UserHelper)类添加到服务容器中。然后您可以执行类似于$user=userHelper->loadByUsername($username)的操作;或userHelper->update($user);竖起大拇指看最后一个链接;刚在本地试用过,效果非常好。所有的应用程序目前都在同一台服务器上,所以现在肯定可以正常工作。我唯一担心的是我们能在同一台服务器上保留它们多长时间,因为有一天可能会有一些应用程序“全球化”,每个平台都有大量用户,但这是另一个问题:-)谢谢你的帮助!
<?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;
    /* ... */
}