多个名称空间中的Doctrine2实体

Mat*_*ari 9 php entity namespaces doctrine-orm zend-framework2

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

是否可以使用Doctrine2 ORM执行此操作?通过阅读文档,似乎总是希望所有实体最多只有一个名称空间,而我希望有

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

怎么可能成为可能呢?

谢谢大家!

Sam*_*Sam 14

学说配置的第一步是在全局配置文件中设置连接.我个人在两个文件中这样做,第一个是./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'
        )
      )
    )
  ),
);
Run Code Online (Sandbox Code Playgroud)

./config/autoload/local.php

return array(
  'doctrine' => array(
    'connection' => array(
      'orm_default' => array(
        'params' => array(
          'user'     => 'root',
          'password' => ''
        )
      )
    )
  ),
);
Run Code Online (Sandbox Code Playgroud)

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

./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'
        )
      )
    )
  )
);
Run Code Online (Sandbox Code Playgroud)

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

下一步完成的是orm_defaults驱动程序通过一个赋值来扩展,该赋值定义ModuleNamespace\Entity从我们的ModuleNamespace_driver配置加载所有类.

最终这是针对每个模块完成的.所以不管你是否有一个Filemanager\Entity\File或多个PictureDb\Entity\File类,两个都可以工作,两个都会被加载.模块本质上是相互独立的.虽然它们可以有依赖关系,或者更好地协同工作,但它们可以自行运行.因此,具有多个实体的多个模块完全没有问题;)

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

这些也可以帮助你一点点.