依赖注入在框架中的应用
如今的 PHP 运用包括了很多对象。有的对象能帮你发送电子邮件,另一个可以帮你把数据耐久化到数据库中。在你的运用中,你能够会创立一个管理产品库存的对象,或许是一个处置第三方 API 数据的对象。这篇文章中,我们的关注这件事情:运用做了很多事情,它组织了很多对象来处置每一个义务。
在 PHP 的 Symfony 2 框架中,有一个特殊的对象,协助你实例化、组织和获取运用中的那一系列的对象。它叫 Service Container(效劳容器),可以让你规范化和集中化地创立运用中对象。容器让生活简化,它速度很快,包括的架构思想促进代码的重用和解耦。一切 Symfony 2 的中心的类都运用容器,容器为框架的速度和可扩展性做了最大的贡献。
先来了解下什么是 Service。
复杂的说,一个 Service 就是任何的可以完成某类“全局”义务的 PHP 对象。一个 Service 是一个 PHP 对象的通用性的术语,这个对象能执行特定的义务,通常被“全局”地运用,比如一个数据库衔接的对象,或许一个能发送电子邮件的对象。假设拥有很多松耦合的 Service,我们就说这个运用遵照了 SOA(面向效劳的架构)。创立一个 Service 很复杂,你只需为那份能完成特定义务的代码写个类,就 OK 了。
普通来说,PHP 对象假设要成为 Service,必需要在运用中被全局的运用。比如一个 Mailer Service 被全局的用于发送电子邮件,但是由 Mailer 发送的邮件内容对象(每次的内容都不同)就不是 Service。
既然 Service 这么容易创立,那有啥了不起的呢?假设你末尾思索将运用中的每个功用都分分开来,你就能末尾感受 Service 的益处了。由于每个 Service 只做一个任务,你在任何中央都可以轻松地取得并运用它们的功用。每个 Service 也能更容易的被测试和配置,由于在运用中它们是相互分别的。将你的运用组织成一系列独立的 Service 的类,也是面向对象编程的最佳实际之一。这种技艺在任何开发言语中都是好顺序员的标志。
什么是 Service Container。
Service Container 也叫 Dependency Injection Container(依赖注入容器),就是一个复杂的 PHP 对象,管理着 Service 们的实例化。
假定你有个发送电子邮件的 PHP 类。假设不用 Service Container,在你需求它时,都必需手工地创立对象。这也算复杂。但是,假设你不想重复地去配置它,就可以把它作为 Service。
当你需求创立一个 Service,它依赖了 Service Container 中一个或几个其他的 Service 们时,你才会看法到容器的弱小。假定你的一个新的 Service,依赖了发送电子邮件的 Service。只需在新的 Service 配置中将发送电子邮件的 Service 设为参数即可,假设你的这个 Service 后来做了改动,需求再依赖一个 Service,只需求改下配置,添加参数即可。
对应到依赖注入形式,其实 Service Container 就是注入器;Service A 依赖 Service B,前者是依赖者,后者是被依赖者;被依赖者的接口普通就是依赖的定义。这次设计形式处置的是整个框架的架构效果,处置了:功用间的松耦合、框架的扩展性,运转效率也高。
其实还是蛮羡慕学 Java 的同窗,很早就接触一些好的设计和运用,比如:Spring 框架。当然如今 PHP 的新的框架层出不穷,也自创各种好的思想。面包和牛奶曾经有了,可以吃了。