欢迎来到天天文库
浏览记录
ID:38779129
大小:97.61 KB
页数:35页
时间:2019-06-19
《关于依赖注入在PHP框架中的应用》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、关于依赖注入在PHP框架中的应用现在的PHP应用包含了很多对象。有的对象能帮你发送电子邮件,另一个可以帮你把数据持久化到数据库中。在你的应用中,你可能会创建一个管理产品库存的对象,或者是一个处理第三方API数据的对象。这篇文章中,我们的关注这件事情:应用做了很多事情,它组织了很多对象来处理每一个任务。在PHP的Symfony2框架中,有一个特殊的对象,帮助你实例化、组织和获取应用中的那一系列的对象。它叫ServiceContainer(服务容器),可以让你标准化和集中化地创建应用中对象。容器让生活简化,它速度很快,包含的架构思想促进代码的重用和解耦。所有Symfony2
2、的核心的类都使用容器,容器为框架的速度和可扩展性做了最大的贡献。先来了解下什么是Service。简单的说,一个Service就是任何的可以完成某类“全局”任务的PHP对象。一个Service是一个PHP对象的通用性的术语,这个对象能执行特定的任务,通常被“全局”地使用,比如一个数据库连接的对象,或者一个能发送电子邮件的对象。如果拥有很多松耦合的Service,我们就说这个应用遵循了SOA(面向服务的架构)。创建一个Service很简单,你只要为那份能完成特定任务的代码写个类,就OK了。一般来说,PHP对象如果要成为Service,必须要在应用中被全局的使用。比如一个Ma
3、ilerService被全局的用于发送电子邮件,但是由Mailer发送的邮件内容对象(每次的内容都不同)就不是Service。既然Service这么容易创建,那有啥了不起的呢?如果你开始考虑将应用中的每个功能都分离开来,你就能开始感受Service的好处了。因为每个Service只做一个工作,你在任何地方都可以轻松地获得并使用它们的功能。每个Service也能更容易的被测试和配置,因为在应用中它们是互相分离的。将你的应用组织成一系列独立的Service的类,也是面向对象编程的最佳实践之一。这种技能在任何开发语言中都是好程序员的标志。什么是ServiceContainer
4、。ServiceContainer也叫DependencyInjectionContainer(依赖注入容器),就是一个简单的PHP对象,管理着Service们的实例化。假设你有个发送电子邮件的PHP类。如果不用ServiceContainer,在你需要它时,都必须手工地创建对象。这也算简单。但是,如果你不想重复地去配置它,就可以把它作为Service。当你需要创建一个Service,它依赖了ServiceContainer中一个或几个其他的Service们时,你才会意识到容器的强大。假设你的一个新的Service,依赖了发送电子邮件的Service。只要在新的Serv
5、ice配置中将发送电子邮件的Service设为参数即可,如果你的这个Service后来做了改动,需要再依赖一个Service,只需要改下配置,增加参数即可。对应到依赖注入模式,其实ServiceContainer就是注入器;ServiceA依赖ServiceB,前者是依赖者,后者是被依赖者;被依赖者的接口一般就是依赖的定义。这次设计模式解决的是整个框架的架构问题,解决了:功能间的松耦合、框架的扩展性,运行效率也高。其实还是蛮羡慕学Java的同学,很早就接触一些好的设计和应用,比如:Spring框架。当然现在PHP的新的框架层出不穷,也借鉴各种好的思想。面包和牛奶已经有了
6、,可以吃了。看Laravel的IoC容器文档只是介绍实例,但是没有说原理,之前用MVC框架都没有在意这个概念,无意中在phalcon的文档中看到这个详细的介绍,感觉豁然开朗,复制粘贴过来,主要是好久没有写东西了,现在确实很懒变得!首先,我们假设,我们要开发一个组件命名为SomeComponent。这个组件中现在将要注入一个数据库连接。在这个例子中,数据库连接在component中被创建,这种方法是不切实际的,这样做的话,我们将不能改变数据库连接参数及数据库类型等一些参数。[php] viewplaincopy1.
7、ent 4.{ 5. 6. /** 7. * The instantiation of the connection is hardcoded inside 8. * the component so is difficult to replace it externally 9. * or change its behavior 10. */ 11. public function someDbTask() 12. { 13. $connection = new
此文档下载收益归作者所有