2013-02-21 69 views
0

我想在包含兩個模塊的ZF2應用程序中使用Doctrine 2,每個模塊都有自己的數據庫。我需要使用跨數據庫連接,以便我可以將一個模塊中的實體與另一個模塊中的實體相關聯。 Here's a UML diagram的設置。ReflectionException在從不同數據庫的Doctrine映射實體時引發

我在我的第一個實體使用這種嘗試(我已經去除了無關緊要的參數和use語句):

namespace Client\Entity; 

/** 
* A website. 
* 
* @ORM\Entity 
* @ORM\Table(name="users.website") 
* ... 
* @property $server 
*/ 
class Website extends BaseEntity { 

    // Other class vars ... 

    /** 
    * @ORM\ManyToOne(targetEntity="Server\Entity\Server", inversedBy="websites") 
    * @ORM\JoinColumn(name="server_id", referencedColumnName="id") 
    */ 
    protected $server; 

而這在我的服務器實體:

namespace Server\Entity; 

/** 
* A server. 
* 
* @ORM\Entity 
* @ORM\Table(name="servers.server") 
* ... 
* @property $websites 
*/ 
class Server extends BaseEntity { 

    // Other class vars ... 

    /** 
    * @ORM\OneToMany(targetEntity="Client\Entity\Website", mappedBy="server") 
    */ 
    protected $websites; 

這種映射作品完全當我創建一個新的網站實體時(通過使用DoctrineModule\Form\Element\ObjectSelect作爲服務器關聯的網絡表單),但是當我去編輯現有網站時,拋出此ReflectionException:

類Server \實體\網站不存在

完整的堆棧跟蹤can be found here。出於某種原因,當服務器實體通過與網站實體的關聯進行訪問時,它認爲所有實體都存在於Server\Entity命名空間中,而不是Client\Entity。我需要做些什麼來確保Server實體在正確的模塊名稱空間中查找?

的CLI命令orm:info生產:

Found 7 mapped entities: 
[OK] Server\Entity\Server 
[OK] Client\Entity\Role 
[OK] Client\Entity\Website 
[OK] Client\Entity\User 
[OK] Client\Entity\Client 
[OK] Client\Entity\Permission 
[OK] Message\Entity\Notification 

orm:validate-schema結果:

[Mapping] OK - The mapping files are correct. 
[Database] FAIL - The database schema is not in sync with the current mapping file. 

我有這個在我模塊的module.config.php每一個:

'driver' => array(
    __NAMESPACE__ . '_driver' => array(
     'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver', 
     'cache' => 'array', 
     'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity') 
    ), 
    'orm_default' => array(
     'drivers' => array(
      __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver' 
     ) 
    ) 
) 
+0

'orm:schema-tool:update --dump-sql'會產生什麼?另外:考慮到DBAL模式工具每次都在單個數據庫上進行自省,所以這可能是這裏的問題(已知的) – Ocramius 2013-02-21 10:39:52

+0

@Ocramius http://pastebin.com/DrtLHqsN。與之前嘗試創建'users.'時存在於'servers.'數據庫之前的內容稍有不同。'數據庫 – hohner 2013-02-21 10:48:59

+0

@Ocramius我也用'orm:schema'成功更新了我的模式-tool:update --force',但是'validate-schema'仍然返回相同的數據庫失敗消息 – hohner 2013-02-21 10:56:53

回答

3

我設法修復它。在我Server\Entity\Server,我有這些getter/setter函數添加/刪除網站:

public function setWebsite(Website $website) 
{ 
    $this->websites->add($website);  
} 

public function removeWebsite(Website $website) 
{ 
    $this->websites->removeElement($website); 
} 

但是你需要指定完整的命名空間作爲參數:

public function setWebsite(\Client\Entity\Website $website) { ... } 

這樣一個愚蠢的錯誤!我發現這個問題是因爲我遍歷了堆棧跟蹤中的每個文件,並達到了試圖將我的實體類中的每個方法/參數保存到代理文件(Doctrine/ORM/Proxy/ProxyFactory中的223行)的程度。 PHP)。

+0

所以代理工廠只是在抱怨錯誤的類名?您能否最終驗證ORM主機的異常消息是否更好? – Ocramius 2013-02-22 10:51:31

+0

因爲我沒有指定完全限定的類名,所以它試圖在Server \ Entity命名空間中實例化它們。也許應該有一種方法將getter/setter函數與關聯映射(通過文件頂部的Doctrine註釋聲明)進行匹配,因此它知道要引用什麼。異常消息總是相同的(我不知道你的意思是ORM主人)。它看起來很長,因爲我正在查看_mapping註釋_而不是getter/setter方法 – hohner 2013-02-22 10:57:43

+0

是的,這是因爲代理工廠需要重寫方法:https://github.com/doctrine/common/blob/master/ lib/Doctrine/Common/Proxy/ProxyGenerator.php#L759-L768。就我所知,自從我重寫了這部分以來,ORM主(最新/最新的邊緣)顯示了一個自定義錯誤消息。只要你用'use'語句正確地導入類,Setter/getters就不需要FQCN – Ocramius 2013-02-22 11:08:23