Orm 从不同数据库映射条令中的实体时引发ReflectionException

Orm 从不同数据库映射条令中的实体时引发ReflectionException,orm,doctrine-orm,zend-framework2,cross-database,Orm,Doctrine Orm,Zend Framework2,Cross Database,我试图在ZF2应用程序中使用Doctrine 2,该应用程序包含两个模块,每个模块都有自己的数据库。我需要使用跨数据库连接,以便将一个模块中的实体与另一个模块中的实体相关联。设置的一部分 我尝试在我的第一个实体中使用它(我删除了不相关的参数和use语句): 在我的服务器实体中: namespace Server\Entity; /** * A server. * * @ORM\Entity * @ORM\Table(name="servers.server") * ... * @p

我试图在ZF2应用程序中使用Doctrine 2,该应用程序包含两个模块,每个模块都有自己的数据库。我需要使用跨数据库连接,以便将一个模块中的实体与另一个模块中的实体相关联。设置的一部分

我尝试在我的第一个实体中使用它(我删除了不相关的参数和
use
语句):

在我的服务器实体中:

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;
当我创建一个新的网站实体时(通过使用服务器关联的
doctriemodule\form\Element\ObjectSelect
的web表单),此映射非常有效,但当我编辑现有网站时,会抛出此ReflectionException:

类别服务器\实体\网站不存在

完整堆栈跟踪。出于某种原因,当从与网站实体的关联访问服务器实体时,它认为所有实体都存在于
Server\entity
命名空间中,而不是
Client\entity
。我需要做什么来确保服务器实体位于正确的模块名称空间中

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'
        )
    )
)

我设法把它修好了。在我的
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.php中的第223ish行)。

我成功地修复了它。在我的
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.php中的第223ish行)。

ORM:schema tool:update--dump sql产生了什么?同样,考虑到DBAL模式工具每次对单个数据库进行自省,这可能是这里的问题(已知的一个)@ Ocramius。与我之前尝试创建
用户中存在的表时略有不同。
进入
服务器。
database@Ocramius我还刚刚用
orm:schema工具:update--force成功地更新了我的模式,但是,
validate schema
仍然返回相同的数据库失败消息。您还可以添加映射配置吗?
orm:generate proxies
是否也引发相同的异常?是的,
orm:generate proxies
显示相同的错误。映射配置是什么意思?在Module.php中我在哪里可以找到它?我认为这可能是因为我在BaseController(使用自定义的连接数组)中动态创建EntityManager,正如我所描述的。但是我正在为每个模块实例化一个,并且仍然遇到相同的问题
orm:schema工具:update--dump sql
产生了什么?同样,考虑到DBAL模式工具每次对单个数据库进行自省,这可能是这里的问题(已知的一个)@ Ocramius。与我之前尝试创建
用户中存在的表时略有不同。
进入
服务器。
database@Ocramius我还刚刚用
orm:schema工具:update--force成功地更新了我的模式,但是,
validate schema
仍然返回相同的数据库失败消息。您还可以添加映射配置吗?
orm:generate proxies
是否也引发相同的异常?是的,
orm:generate proxies
显示相同的错误。映射配置是什么意思?在Module.php中我在哪里可以找到它?我认为这可能是因为我在BaseController(使用自定义的连接数组)中动态创建EntityManager,正如我所描述的。但是我正在为每个模块实例化一个,但仍然遇到相同的问题代理工厂只是抱怨类名错误?您是否能够最终验证ORM master是否改善了异常消息?因为我没有指定完全限定的类名,所以它试图在Server\Entity命名空间中实例化它们。也许应该有一种方法将getter/setter函数与关联映射(通过文件顶部的条令注释声明)相匹配,以便它知道引用什么。异常消息总是一样的(我不知道你说的ORM master是什么意思)。诊断时间太长了,因为我查看的是映射注释而不是getter/setter方法,这是因为代理工厂需要重写方法:。据我所知,ORM master(最新/最前沿)显示了一条自定义错误消息,因为我重写了该部分。setter/getter不需要FQCN,只要您使用
use
语句正确导入类是的,我现在意识到了这一点(
use
语句)。我有普通条令的2.3版,因为它与Composer中的条令模块捆绑在一起。我看得出你一直在忙着重写2.4!我现在安装它只是为了测试。。。它尚未标记!:)那么代理工厂只是在抱怨错误的类名?您是否能够最终验证ORM master是否改善了异常消息?因为我没有指定完全限定的类名,所以它试图在Server\Entity命名空间中实例化它们。也许应该有一种方法将getter/setter函数与