我正在使用Zend Framework 2开发一个web应用程序,该应用程序将由几个模块组成,我想将实体类放在它们所属的模块中。
使用Doctrine2 ORM可以做到这一点吗?通过阅读文档,似乎总是希望将所有实体最多放在一个命名空间下,而我希望有
- 模块1\实体
- 模块2\实体
- 等等
这是怎么可能的?
感谢大家!
条令配置的第一步是在全局配置文件中设置连接。就我个人而言,我在两个文件中这样做,第一个文件是./config/autoload/global.php
,第二个是./config/autoload/local.php
这是因为一个原因,那就是任何包含local
的内容都不会发布到我的git存储库中。所以我的证件是安全的。
/config/autoload/global.php
return array(
'doctrine' => array(
'connection' => array(
'orm_default' => array(
'driverClass' => 'DoctrineDBALDriverPDOMySqlDriver',
'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' => 'DoctrineORMMappingDriverAnnotationDriver',
'cache' => 'array',
'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')
),
'orm_default' => array(
'drivers' => array(
__NAMESPACE__ . 'Entity' => __NAMESPACE__ . '_driver'
)
)
)
)
);
那里发生了什么?好吧,我们通过添加一个新的驱动程序来扩展条令[驱动程序]数组。驱动程序具有我们模块的命名空间。为此,我们还需要在配置文件中定义名称空间。驱动程序定义此驱动程序的所有实体都在某个路径内。
完成的下一步是通过一个赋值来扩展orm_defaults
驱动程序,该赋值定义了从ModuleNamespace_driver
配置加载所有ModuleNamespaceEntity
类。
最终,这是为每个模块完成的。因此,无论您有一个FilemanagerEntityFile
或PictureDbEntityFile
类,它们都会起作用,并且都会被加载。模块本质上是相互独立的。尽管它们可以有依赖关系,或者更确切地说,它们可以很好地协同工作,但它们是独立运作的。因此,具有多个实体的多个模块根本没有问题;)
我希望这能让你稍微理解一下这个话题。对于现场工作的例子,我写了两篇关于这个主题的博客文章。
- 为Zend Framework 2安装条令2
- 原则2的第一步
这些也可能对您有所帮助。
如果您正在使用DoctrineORMModule代理,则会写入/data/DoctrineORMModule/Proxy。我不确定您是否必须手动创建文件夹并调整权限。
收件人:由于某些原因,ZendSkeletonApplication在出厂时没有设置名称空间!ZendSkeletonApplication/module/Application/config/module.config.php
如果您忘记在每个模块.config.php中设置命名空间,则可能会出现此错误!课堂。。。在链配置的命名空间ZfcUser\Entity,\Entity、ZfcUserDoctrineORM\Entity中找不到