【问题标题】:Doctrine2 entities in multiple namespaces多个命名空间中的 Doctrine2 实体
【发布时间】:2012-09-25 03:53:25
【问题描述】:

我正在使用 Zend Framework 2 开发一个 Web 应用程序,该应用程序将由多个模块组成,我想将实体类放在它们所属的模块中。

是否可以使用 Doctrine2 ORM 做到这一点?通过阅读文档,似乎总是希望所有实体至多在一个命名空间下,而我希望拥有

  • 模块1\实体
  • 模块2\实体
  • 等等……

这怎么可能?

谢谢大家!

【问题讨论】:

  • 应该没有问题。实体管理器从每个module.config.php 加载几个驱动程序。每个模块都有自己的驱动程序和实体。经理是所有这些的主人,所以不会有任何问题。或者您在理解方面到底有什么问题?
  • 好吧,我已经阅读了文档,但是我对这种编程很陌生,我以前总是使用简单的程序风格。你能给我一个如何做正确配置的例子吗?我现在还没有尝试过任何东西,因为我仍在四处寻找最适合这项工作的工具。

标签: php namespaces doctrine-orm entity zend-framework2


【解决方案1】:

原则配置的第一步是在您的全局配置文件中设置连接。我个人在两个文件中执行此操作,第一个是 ./config/autoload/global.php,第二个是 ./config/autoload/local.php

这是出于一个非常原因,即任何包含 local 的内容都不会发布到我的 git 存储库中。所以我的凭据是安全的。

./config/autoload/global.php

return array(
  'doctrine' => array(
    'connection' => array(
      'orm_default' => array(
        'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
        'params' => array(
          'host'     => 'localhost',
          'port'     => '3306',
          'dbname'   => 'dbname'
        )
      )
    )
  ),
);

./config/autoload/local.php

return array(
  'doctrine' => array(
    'connection' => array(
      'orm_default' => array(
        'params' => array(
          'user'     => 'root',
          'password' => ''
        )
      )
    )
  ),
);

第二步是为您的实体创建驱动程序。这是在模块命名空间基础上完成的。

./modules/ModuleNamespace/config/module.config.php

<?php
namespace ModuleNamespace;

return array(
  //... some more configuration

  'doctrine' => array(
    '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'
        )
      )
    )
  )
);

那里发生了什么?好吧,我们通过添加一个新的驱动程序来扩展教义['driver'] 数组。驱动程序具有我们模块的命名空间。为此,我们还需要在配置文件中定义命名空间。驱动程序定义该驱动程序的所有实体都在某个路径内。

下一步完成的是,orm_defaults 驱动程序通过定义所有ModuleNamespace\Entity 类从我们的ModuleNamespace_driver 配置加载的分配进行扩展。

最终,这是针对每个模块完成的。因此,无论您使用的是 Filemanager\Entity\File 还是 PictureDb\Entity\File 类,两者都可以工作并且都将被加载。模块本质上是相互独立的。尽管它们可以有依赖关系,或者更确切地说可以很好地协同工作,但它们可以独立运行。所以具有多个实体的多个模块完全没有问题;)

我希望这能让你稍微理解这个话题。对于实时工作示例,我写了两篇涵盖该主题的博客文章。

这些也可能对您有所帮助。

【讨论】:

  • 我想问你一个澄清:你已经清楚地向我展示了如何配置各种模块的驱动程序并告诉他们在哪里可以找到实体,但是我如何配置代理文件夹?我显然也想让它们命名空间。
  • 知道proxies folders 是什么意思:S
  • 如果我没记错的话,Doctrine2 应该为实际的实体类生成代理类以执行延迟加载,至少这是我在文档中看到的。例如,它们在这里被提及:doctrine-orm.readthedocs.org/en/latest/tutorials/…
  • 好吧,我不是专家,但我认为在 ZF2 中不需要。正如您在我提供的第一个链接中看到的那样,它就像那样工作^^
【解决方案2】:

如果您使用的是DoctrineORMModule代理将被写入/data/DoctrineORMModule/Proxy。我不确定您是否必须手动创建文件夹并调整权限。

注意: 出于某种原因,ZendSkeletonApplication 没有设置命名空间! ZendSkeletonApplication / module / Application / config / module.config.php

如果您忘记在每个 module.config.php 中设置 namespace,可能会出现此错误! 在链配置的命名空间 ZfcUser\Entity、\Entity、ZfcUserDoctrineORM\Entity 中找不到类 ...

【讨论】:

    猜你喜欢
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    相关资源
    最近更新 更多