我正在使用Zend Framework 2开发一个Web应用程序,它将由几个模块组成,我想将实体类放在它们所属的模块中。
是否可以使用Doctrine2 ORM执行此操作?通过阅读文档,似乎总是希望所有实体最多只有一个命名空间,而我想要
怎么可能这样做?
感谢所有人!
答案 0 :(得分:14)
学习配置的第一步是在全局配置文件中设置连接。我个人在两个文件中执行此操作,第一个是./config/autoload/global.php
,第二个是./config/autoload/local.php
这是有一个原因,这是因为包含local
的任何内容都不会发布到我的git存储库中。所以我的证书是安全的。
<强> ./配置/自动加载/ 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'
)
)
)
),
);
<强> ./配置/自动加载/ local.php 强>
return array(
'doctrine' => array(
'connection' => array(
'orm_default' => array(
'params' => array(
'user' => 'root',
'password' => ''
)
)
)
),
);
第二步是为您的实体创建驱动程序。这是在模块命名空间基础上完成的。
<强> ./模块/ ModuleNamespace /配置/ 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'
)
)
)
)
);
那里发生了什么?好吧,我们通过添加一个新的驱动程序来扩展doctrine ['driver']数组。驱动程序具有我们模块的命名空间。为此,我们还需要在配置文件中定义命名空间。驱动程序定义此驱动程序的所有实体都在特定路径中。
完成的下一步是orm_defaults
驱动程序通过一个赋值进行扩展,该赋值定义从我们的ModuleNamespace\Entity
配置加载所有ModuleNamespace_driver
类。
最终这是针对每个模块完成的。所以无论你有Filemanager\Entity\File
还是PictureDb\Entity\File
类,两者都会有效,两者都会被加载。模块本质上是相互独立的。虽然它们可以有依赖关系,或者更好地协同工作,但它们可以自行运行。因此,具有多个实体的多个模块完全没有问题;)
我希望这能让你理解一下这个话题。对于实时工作示例,我写了两篇关于该主题的博客文章。
这些也可以帮到你一点点。
答案 1 :(得分:0)
如果您使用 DoctrineORMModule 代理将写入 / data / DoctrineORMModule / Proxy 。我不确定您是否必须手动创建文件夹并调整权限。
注意: 出于某种原因, ZendSkeletonApplication 没有设置名称空间! ZendSkeletonApplication / module / Application / config / module.config.php
如果您忘记在每个 module.config.php 中设置命名空间,则可能会出现此错误! 在链配置的命名空间中找不到类... ZfcUser \ Entity,\ Entity,ZfcUserDoctrineORM \ Entity