Laravel的Ioc设计

原创 2015年07月09日 14:06:09

云智慧(北京)科技有限公司
一、IoC的概念介绍
控制反转(IOC)模式(又称DI:DependencyInjection)就是Inversion ofControl,控制反转。在Java开发中,IoC意 味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。
IoC(Inversion of Control)是近年来兴起的一种思想,不仅仅是编程思想。主要是协调各组件间相互的依赖关系,同时大大提高了组件的可移植性,组件的重用机会也变得更多。在传统的实现中,由程序内部代码来控制程序之间的关系。我们经常使用new关键字来实现两组键间关系的组合,这种实现的方式会造成组件之间耦合(一个好的设计,不但要实现代码重用,还要将组件间关系解耦)。IoC很好的解决了该问题,它将实现组件间关系从程序内部提到外部容器来管理。也就是说由容器在运行期将组件间的某种依赖关系动态的注入组件中。控制程序间关系的实现交给了外部的容器来完成。即常说的好莱坞原则“Don’t call us, we’ll call you”。
那么,在Laravel框架中Ioc模式是如何实现的呢?

二、Laravel框架中Ioc模式的实现方式
1.请求实现的流程图
这里写图片描述
在请求流程图中可以看到有两个比较重要的文件start.php和Application.php,其中,start.php文件中引入了全局变量app=newIlluminate\Foundation\Application;app就是为我们解决所有注入依赖关系的“管家婆”,它会把应用中所用到的工具类提前存储起来,当用到的时候可以随时的提取。

2.采用数组的方式管理对象
lluminate\Foundation\Application类继承了laravel的容器Container和php的标准接口ArrayAccess,从而实现了数组方式管理对象。
php的标准接口ArrayAccess中包含了四个属性:
下面是ArrayAccess 的定义:

interface ArrayAccess

boolean offsetExists($index)

mixed offsetGet(index)voidoffsetSet(index, newvalue)voidoffsetUnset(index)
Application类中继承的container类对这四个抽象方法进行了重写,实现了应用中所用到的功能。Container类中的两个属性bindingsinstances是用来存放实际应用中所用到的工具类实例。这样我们就可以通过$app[‘工具类的别名’]或者通过“工具类的别名::方法名”的方式来调用真正的工具类实例中的方法。
列如,路由中常用的方式: Route::post(‘url’,’controller@method’);

将服务注册到$app全局变量中,laravel的实现方式是读取app/config/app.php配置,并将
‘providers’ => array(
‘Illuminate\Foundation\Providers\ArtisanServiceProvider’,
‘Illuminate\Auth\AuthServiceProvider’,
‘Illuminate\Cache\CacheServiceProvider’,
‘Illuminate\Session\CommandsServiceProvider’,
‘Illuminate\Foundation\Providers\ConsoleSupportServiceProvider’,
‘Illuminate\Routing\ControllerServiceProvider’,
‘Illuminate\Cookie\CookieServiceProvider’,
‘Illuminate\Database\DatabaseServiceProvider’,
‘Illuminate\Encryption\EncryptionServiceProvider’,
‘Illuminate\Filesystem\FilesystemServiceProvider’,
‘Illuminate\Hashing\HashServiceProvider’,
‘Illuminate\Html\HtmlServiceProvider’,
‘Illuminate\Log\LogServiceProvider’,
‘Illuminate\Mail\MailServiceProvider’,
‘Illuminate\Database\MigrationServiceProvider’,
‘Illuminate\Pagination\PaginationServiceProvider’,
‘Illuminate\Queue\QueueServiceProvider’,
‘Illuminate\Redis\RedisServiceProvider’,
‘Illuminate\Remote\RemoteServiceProvider’,
‘Illuminate\Auth\Reminders\ReminderServiceProvider’,
‘Illuminate\Database\SeedServiceProvider’,
‘Illuminate\Session\SessionServiceProvider’,
‘Illuminate\Translation\TranslationServiceProvider’,
‘Illuminate\Validation\ValidationServiceProvider’,
‘Illuminate\View\ViewServiceProvider’,
‘Illuminate\Workbench\WorkbenchServiceProvider’,

),
通过\Illuminate\Foundation\start.php文件中的
providers=config[‘providers’];
app>getProviderRepository()>load(app,providers);app中。同时,在该文件中还会执行
aliases=config[‘aliases’];
AliasLoader::getInstance($aliases)->register();
这样就可以实现使用别名访问想要运行的服务了。

利用控制反转和别名的好处:
Laravel中通过控制反转的方式可以解决相同的调用方式,但可以采取不同的实现方式。这样我们就不用更改业务逻辑中的代码,就能更换不同的解决问题的方式。
例如,Laravel用到的Cache,在业务逻辑代码中只需要使用Cache::set(),就可以设置cache缓存了。但是,具体是用什么方式做的cache我们是不用关心的。因为,$app[‘cache’]中即可以存放redis的实例,也可以存放memcache的实例,这个是可以通过配置文件来确定的。
如果要是用传统的cache方式,将会是Redis::set()或者是Memcache::set()的方式,这样我们在想换不同的cache存储方式的时候就要通过更改业务逻辑代码才能完成。**

一篇让你真正理解 Laravel IoC 模式的文章

学习 Laravel 框架看它有 IoC 的介绍,看着很是费解,因为没有将具体的原理细节,自己去看源码有很困难。有天看到了一篇文章介绍 IoC(出自phalcon介绍文档),仔细研读之后发现,果然是豁...
  • zl20117
  • zl20117
  • 2016年12月23日 11:48
  • 289

理解PHP 依赖注入|Laravel IoC容器

看Laravel的IoC容器文档只是介绍实例,但是没有说原理,之前用MVC框架都没有在意这个概念,无意中在phalcon的文档中看到这个详细的介绍,感觉豁然开朗,复制粘贴过来,主要是好久没有写东西了,...
  • realghost
  • realghost
  • 2014年06月27日 08:57
  • 15068

如何理解Laravel 的IOC 服务容器

学习laravel快小一年了,到现在才去研究laravel 的核心 ‘容器 IOC’ 这些概念. 写项目的时候有大概看看关于IOC 文章, 但是没有深入理解,只是有个概念,赶着写代码, 虽然代码也写的...
  • oZuoAZuo
  • oZuoAZuo
  • 2017年03月09日 09:59
  • 1170

Laravel 服务容器实例教程 —— 深入理解控制反转(IoC)和依赖注入(DI)

代码是最为耐心、最能忍耐和最令人愉快的伙伴,在任何艰难困苦的时刻,它都不会抛弃你。        今天我们着重谈谈什么是IoC?什么是依赖注入? 为什么要用这些所谓的概念,怎么运用呢? 其实我...
  • chajinglong
  • chajinglong
  • 2017年04月26日 18:02
  • 744

sping IoC设计模式好处与劣势

Spring IOC 好处和劣势                分类:            技术文档2012-03-26 15:154225人阅读评论(0)收藏举报 iocsprin...
  • u013305082
  • u013305082
  • 2014年09月30日 13:59
  • 882

laravel框架中所蕴含的两个重要的面向对象设计模式

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC 、DI这两个概念是模糊不清的,是很难理解的,今天和大家...
  • qq_31989521
  • qq_31989521
  • 2016年06月11日 10:55
  • 3346

AOP和IoC实现原理【用到的设计模式】

文章来源:http://blog.csdn.net/longyulu/article/details/36174979 用过spring的朋友都知道spring的强大和高深,都觉得深不可测,...
  • buster2014
  • buster2014
  • 2015年08月05日 16:49
  • 2850

设计模式--IOC(DI)与AOP思想涉及的模式

这几天简单了解学习了Spring框架,其中的IOC(DI)与AOP的特性自然是其精髓所在,正好也在学习设计模式,结合设计模式理解了一下 1.IOC(DI)依赖注入--State模式    ...
  • wu_qionglei
  • wu_qionglei
  • 2013年03月01日 12:47
  • 7581

初学spring 关于IOC与AOP 使用的设计模式

IOC(Inverse of Control) 控制反转 以前程序中需要使用对象时,需要自己new一个,造成程序与对象的强耦合。 IOC 对象的生成交给spring容器完成 DI(Dep...
  • H12KJGJ
  • H12KJGJ
  • 2017年06月23日 08:53
  • 289

Spring源码解析之IoC容器主要接口设计

IoC的主要接口设计图如下面所示: 其中BeanFactory和ApplicationContext两个为主要接口。 下面分析一下这张图: 从图中我们可以得到,从接口BeanFactory—》Hi...
  • hsj1213522415
  • hsj1213522415
  • 2017年02月14日 09:39
  • 352
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Laravel的Ioc设计
举报原因:
原因补充:

(最多只允许输入30个字)