2016-11-28 107 views
2

我正在尋找一種方法來爲我們的客戶之一共享多個Symfony2應用程序之間的用戶。在過去的三年中,我們爲他們提出了幾個具有不同用途的應用程序(4),但始終使用「相同」的用戶模型和數據。Symfony2 - 在多個應用程序之間共享用戶

目前,我們有4個獨立的數據庫,其中「users」表在所有應用程序中都是相同的,除了多對多關係之外。起初,我正在考慮添加第二個實體管理器(和連接),並將用戶放入單獨的數據庫中。所有的應用程序都可以使用它,並且所有用戶都擁有相同的憑據。但是,我如何處理多對多的關係呢?

舉例來說,在應用程序A上,您有一個從「用戶」到「客戶」的多對多關係,但「客戶」表在應用程序B/C/D中不存在。在應用程序B上,您有「用戶」到「供應商」之間的多對多關係,但「供應商」表在應用程序A/C/D中不存在,等等。將「客戶」或「供應商」表移動到共享數據庫也不是真正的選擇,因爲其他實體(不共享)也與這些表有關係。

我基本上需要找到一種方法來映射「共享用戶」模型/數據庫上的多對多關係,這對每個應用程序都是唯一的。有沒有辦法用多個數據庫來實現這一點?我應該去採取其他方法嗎?

歡迎所有信息。提前致謝。

+0

我認爲的第一件事情是,它不是強制性的使用Doctrine的設計關係映射d僅用於數據庫關係。您也可以在實體內手動填充數組。大多數情況下,您需要添加到服務容器的UserManager(或UserHelper)類。然後你可以做一些像$ user = userHelper-> loadByUsername($ username);或userHelper-> update($ user); –

回答

3

選項1

使用不同的連接,這似乎不可能與開箱即用的原則。

類似的問題都得到了解答不已:

正如在第一個答案說,你可以做到以下幾點:

保持對象通過保存相關對象的標識符斷開圖形(舊的tyle)而不是對它們的引用,然後通過服務手動獲取對象。

但是,如果您希望Doctrine真正瞭解關聯,您需要將關聯的實體保存在同一個數據庫中,否則您的映射只會產生錯誤。這意味着你需要複製用戶實體。

選項2

在非常特殊的情況下,你可以使用相同的連接(即與同一主機上,並與同一用戶在同一數據庫管理系統的多個數據庫),似乎有一種方式,但我沒有測試它: https://techpunch.co.uk/development/using-multiple-databases-with-symfony2-and-doctrine2

的想法是前綴的每一個表的數據庫名稱,就好像它是一個架構名稱,如:

這個實體映射到«用戶»數據庫中的用戶«用戶»:

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

/** 
* @ORMTable(name="users.User") 
*/ 
class 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; 
    /* ... */ 
} 

筆者還鏈接到一個github上的示例項目: https://github.com/lobsterdore/symfony2-multiple-db-example

+0

贊成最後一個鏈接;只是在本地嘗試了它,它的工作完美。所有的應用程序目前都在同一臺服務器上,所以這絕對是現在可以運行的東西。我擔心的唯一問題是我們能夠將它們全部保留在同一臺服務器上多久,因爲有一天這些應用程序有可能會「全球化」,每個平臺上的用戶數量很大,但這是另一個問題:-)感謝您的幫助! –

相關問題