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 核心组件:如何给 TP3.1 用上 IoC 容器 (一)

单位的主项目是用ThinkPHP 3.1 开发的. 功能越来越跟不上发展 , 而老代码迭代的难度又很大 . 重构已经提上了日程, 但抛下主营业务来重构是不实际的 . 所以目前的思路是 , 将原有功能拆...

Laravel 4 IoC Container

IoC stands for Inversion of Control, and it is effectively just a fancy way of describing a concept ...

详解Laravel服务提供者 IOC(控制反转)、依赖注入

原文地址: http://www.insp.top/learn-laravel-container ,转载务必保留来源,谢谢了! 交流群:296177986 容器,字面上理解就是装东西的东西。...

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

友情提示:本文有点长,但绝对都是干货,请耐心读完,必有收获! 容器,字面上理解就是装东西的东西。常见的变量、对象属性等都可以算是容器。一个容器能够装什么,全部取决于你对该容器的定义。当然,有这样...

laravel核心之ioc容器

使用ioc(控制反转)容器的目的就是为了降低DI(依赖注入); class Container { protected $binds; protected $instanc...

详解Laravel依赖注入(DI)和Ioc容器

Laravel这个框架,用起来方便,理解起来不简单。 为什么不简单?因为包含了一大堆所谓“先进”的概念,其中依赖注入(DI)和Ioc容器是比较核心的内容之一。 我百度了一下,讲PHP DI...

Laravel核心---IoC 容器

容器,字面上理解就是装东西的东西。常见的变量、对象属性等都可以算是容器。一个容器能够装什么,全部取决于你对该容器的定义。当然,有这样一种容器,它存放的不是文本、数值,而是对象、对象的描述(类、接口)或...

如何理解Laravel 的IOC 服务容器

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

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

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

JAVA设计模式之IOC实战01

  • 2015-08-27 10:13
  • 38.15MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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