我最近创建的软件包依赖于存储库接口。源数据的选择之一是数据库和Doctrine ORM。由于数据库只是可能的选择之一,因此我不想集成整个Doctrine ORM包,而是要创建一个仅依赖于Doctrine \ ORM \ EntityManagerInterface的适当适配器。问题是我如何才能部分地从Doctrine ORM中“要求作曲家”?我想补充一点,我无法使用Doctrine ORM EntityManagerInterface找到任何单独的程序包。
谢谢。
答案 0 :(得分:2)
没有办法只需要一个包中的单个类/接口。相反,您需要doctrine/persistence。该库提供持久性接口,然后由Doctrine ORM / ODM使用。而不是依靠EntityManagerInterface
,而是依靠ObjectManager
接口。
如果您既不想依赖于教义/规范,也不想依赖于教义/持久性,则应该使用require-dev
和suggests
来允许在开发过程中使用这些依赖关系,例如用于针对Doctrine EntityManager编写测试,并告知您的库用户,您明确支持哪些持久性库,也需要这些持久性库。
您还可以创建自己的EntityManagerInterface
,然后提供第二个软件包以与不同的提供程序集成,然后在适配器中实现该接口。因此,您不必公开自己的理论/规范,而是公开自己的界面,并为诸如理论/规范之类的数据提供者提供自定义库。这样,您就可以逆转依赖项要求,但是不幸的是,您将需要进行更多的维护工作。您可以查看php-http/httplug之类的项目以及相应的php-http / *-client软件包以获取启发。在集成多个客户端(枪口,curl等)时,它们采用类似的方法,并在它们之上提供通用的抽象。