关于依赖注入在PHP框架中的应用

现在的 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 的新的框架层出不穷,也借鉴各种好的思想。面包和牛奶已经有了,可以吃了。

未经允许不得转载:SuperMan's blog » 关于依赖注入在PHP框架中的应用

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址