初探Laravel框架中的源码(一)
来源:互联网 发布:淘宝暴利行业排行榜 编辑:程序博客网 时间:2024/05/18 00:16
写在前面的话:
最近利用下班的空余时间看了一下Laravel框架中的源码。发现他所用到的设计方法和理念都是已经存在的。之前使用JavaWeb的时候也常用到。所以最近我想通过对框架中源码的分析,进一步提高我对设计模式的理解。
在Laravel中,服务容器是整个系统功能调度的核心,在JavaWeb中类似于ApplicationContext 。它提供了一系列在框架运行的过程中需要的一系列服务。服务容器就是提供服务的载体,而服务是系统运行过程中需要的东西,如系统配置,文件路径等。线面先来介绍一下一些设计模式作为铺垫。
依赖与耦合
服务容器可以提供很多内容,而在这些功能中,解决依赖实现解耦是应用服务器的关键。其实服务容器就是一个IoC容器。IoC其实就是控制反转模式,主要用来解决系统组件间的相互依赖,这也是面向对象设计语言最避讳的点之一。
下面都过一个示例来说明什么是依赖,怎么解决系统对象之间的耦合:
<?php//设计公共接口interface Play{ public function go();}//实现不同的玩耍方案class Panic implements Play{ public function go() { echo "去野炊"; }}class Song implements Play{ public function go() { echo "去KTV唱歌"; }} class Hiking implements Play{ public function go() { echo "去徒步旅行"; }}//设计公司类,该类实现休息的功能时依赖玩耍的实例class Company{ protected $relaxMethod; public function __construct() { //Attention!!! 这里产生了依赖 $this->relaxMethod = new Panic(); } public function relax() { $this->relaxMethod->go(); }}
这里要实现的功能是公司周末的休息方案,而出去玩可能有很多方案,比如KTV唱歌,野炊,徒步旅行。代码“$this->relaxMethod = new Panic();”中实例化了野炊,于是两个代码之间的耦合就产生了。这会导致一个严重的问题,如果需求经常改变,就需要修改实例化的对象。所以我们不应该在“公司类”的内部写死了“休息方案”的初始化行为,而是把控制权交给外部负责,载系统运行期间,将这种依赖关系通过动态注入的方式实现。
工厂模式
休息方案的实例化过程是经常需要改变的,所以我们把这部分的职责交给外部来管理。面向对象有个设计准则叫OCP,意思是发现变化封装变化大家可看我的这篇 博客。一种简单的实现方案是利用简单工厂模式实现。示例如下:
class RelaxMethodFactory{ public function createRelaxMethod($name) { switch ($name) { case 'Panic': return new Panic(); break; case 'Song': return new Song(); break; case 'Hiking': return new Hiking(); break; default: exit('老铁,出毛病了'); break; } } } class Company { protected $relaxMethod; public function __construct($relaxMethodName) { //通过工厂产生依赖的休息方案实例 $factory = new RelaxMethodFactory(); $this->$relaxMethod = $factory->createRelaxMethod($relaxMethodName); } public function relax() { $this->relaxMethod->go(); } }
这里我们添加了“休息方案”工厂,在“公司团体”实例化的过程中指定休息的方案。但是从本质上并不能解决系统耦合的关系。表面上看似“公司团体”与“休息方案”之间的耦合没有了。但是却变成了“公司团体”与“休息方案工厂”之间的耦合。当需求增加时,我们需要修改简单工厂模式,如果依赖过多,工厂类过于庞大,不容易维护。
IoC模式
控制反转是将组件间的依赖关系从程序内部提到外部容器来管理,而依赖注入是将依赖通过外部以参数的形式注入,比如我们写Controller时,有时候需要访问Request对象,可以在方法中声明。
解决系统间依赖根本是,没有用new关键字来实例化对象,不需要人为关注类之间的依赖关系,只要在容器填充过程中实现类与依赖接口之间的关系。这里类的实例化实际上与Spring容器类似。在容器中直接填充实例化对象。Laravel的服务容器指得就是这个容器,它的核心功能是IoC容器用以解决依赖注入,面对服务容器中的填充部分称为服务提供者。
持续关注。。。
- 初探Laravel框架中的源码(一)
- googletest初探(一) 源码中的例子
- 新手解读:laravel 框架源码分析(一)
- laravel源码分析(一)
- laravel框架学习(一)
- minidlna源码初探(一)
- Laravel框架学习(ORM<一>)
- laravel(一)-为什么要使用框架
- laravel框架总结一
- Laravel框架学习-1.初探路由
- laravel框架学习(一)安装laravel,及laravel-ide-helper增强代码提示
- PHP MVC 框架Symfony初探(一)
- XPOSED一、框架初探
- 学习laravel框架一:准备
- laravel框架入门记录(一)
- laravel框架使用总结(一)
- laravel框架中的MySQL事务处理
- 初探Laravel
- 基于OpenCV的视频图像组态 (8) :随机线条动画效果
- Tiny6410 的NandFlash(K9GAG08U0E)
- DecaWave产品简略总结
- 第十五周项目一(3)——验证算法之直接选择排序
- iOS开发UI篇—Quartz2D复杂图形绘制(三) 图片文字,进度条,饼形图,小黄人
- 初探Laravel框架中的源码(一)
- 高德地图(一)之简单集成
- Android studio提示Android studio 在gradle文件中引入support:appcompat-v7:22.2.0包的时候出现Failed to resolve的错误
- 获取在CS-money上某件物品价格波动的图表
- 人工智能的伦理问题
- Win10下Anaconda 2与3 共存,dos 切换,jupyter notebook 切换,pycharm 切换
- 20170618
- Java基本数据类型、包装类与String类之间的转换
- 【python】【穆晨】【171209】连续第六十天总结