考虑到现代 OOP 实践,我如何在我的应用程序中使用 Doctrine?
Posted
技术标签:
【中文标题】考虑到现代 OOP 实践,我如何在我的应用程序中使用 Doctrine?【英文标题】:How do I use Doctrine from within my application, considering modern OOP practices? 【发布时间】:2015-11-16 17:10:34 【问题描述】:Doctrine 示例通常使用 Doctrine 的$entityManager
。因此,每当我需要在我的应用程序中使用 Doctrine 做任何事情时,我都需要将实体管理器放入我的代码中。但是怎么做? ....我可以将它注入我的班级,但我仍然需要先在某个地方创建经理。我也可以让它使用 php 的 trait,我把它放到我的类中,让它支持 Doctrine。
我在 OOP 代码中所做的事情是这样的——我在自己的命名空间 DoctrineConnector
中定义了一个类 DoctrineConnector
,并且在类内部我有一个 static 函数 @ 987654325@。在里面,我读取了 Doctrine 配置、路径、参数,并创建了一个$entityManager
,然后我将它返回给调用者。
每当我需要在我的 Doctrine-unware 代码中读取或保留某些内容时,我都会这样做:
//Pricing.php
use DoctrineConnector\DoctrineConnector;
class Pricing
public function getPricing()
$entityManager = DoctrineConnector::getEntityManager();
//further Doctrine code to read DB
DoctrineConnector 现在是定价的依赖项。明显的答案可能是“将$entityManager
注入定价”。但是Pricing
是从另一个类调用的,而另一个类是从另一个类调用的,等等,所以我必须让我调用的每个类都知道 ORM 变量。我想避免这种情况。
我目前的方法还好还是有更好的方法?
ZF2模组系统是如何做到的
出于好奇,我研究了 ZF2 如何管理 Doctrine 模块,并从 DoctrineORMModule 开始,它使用 ServiceLocator
模式调用控制器内部。因此,领先的框架模块系统之一离我的实现并不遥远。
【问题讨论】:
【参考方案1】:单例模式
改编自http://www.phptherightway.com/pages/Design-Patterns.html
namespace ABC;
use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;
class DoctrineConnector
private static $instance;
public static function getEntityManager()
if (null === static::$instance)
// Doctrine Config (from Docs)
include 'config/doctrine-config.php';
$config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode);
static::$instance = EntityManager::create($dbParams, $config);
return static::$instance;
protected function __construct()
private function __clone()
private function __wakeup()
//to call
$em = DoctrineConnector::getEntityManager();
//if used later in the code - calls same instance
$em = DoctrineConnector::getEntityManager();
【讨论】:
【参考方案2】:有几种流行的方法可以在类中获取依赖项。
让类了解项目环境并让类定位依赖项(您对 DoctrineConnector 所做的) 使用依赖注入(您想要实现的目标)在你的情况下,你的类现在依赖于 DoctrineConnector 并且只要它可以找到 DoctrineConnector 就可以工作。如果您将您的课程移植到另一个未定义 DoctrineConnector 的项目中,您的代码将无法正常工作。
通常,依赖注入是您在开始新项目时做出的决定。如果您已经拥有大量的类层次结构,则注入代码将在您的层次结构中冒泡,并且将需要大量工作来重构您的代码。你可能想想想你是否真的需要它,以及它是否值得你花时间。
如果您正在为某个特定应用编写代码并且没有计划将其迁移到其他项目,那么您可能并不关心依赖注入。实际上,如果没有注入,您的代码将变得更短、更容易(更快)编写和理解。另一方面,如果您希望有一段代码独立于应用程序,您可能只对这些代码段使用依赖注入。
如果您还没有注入 ORM,很可能其余代码也与您的应用紧密耦合,并且注入 entityManager 不会使您的代码更加可移植。
【讨论】:
以上是关于考虑到现代 OOP 实践,我如何在我的应用程序中使用 Doctrine?的主要内容,如果未能解决你的问题,请参考以下文章