0

0

Laravel的Ioc设计

php中文网

php中文网

发布时间:2016-06-20 12:53:11

|

1071人浏览过

|

来源于php中文网

原创


云智慧(北京)科技有限公司

一、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 = new Illuminate\Foundation\Application;注意该全局变量$app就是为我们解决所有注入依赖关系的“管家婆”,它会把应用中所用到的工具类提前存储起来,当用到的时候可以随时的提取。

 

2.采用数组的方式管理对象

lluminate\Foundation\Application类继承了laravel的容器Container和php的标准接口ArrayAccess,从而实现了数组方式管理对象。

php的标准接口ArrayAccess中包含了四个属性:

下面是ArrayAccess 的定义:

 

interface ArrayAccess

 

boolean offsetExists($index)

 

mixed offsetGet($index)

void offsetSet($index, $newvalue)

void offsetUnset($index)

Application类中继承的container类对这四个抽象方法进行了重写,实现了应用中所用到的功能。Container类中的两个属性$bindings和$instances是用来存放实际应用中所用到的工具类实例。这样我们就可以通过$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',

AI Web Designer
AI Web Designer

AI网页设计师,快速生成个性化的网站设计

下载

        '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存储方式的时候就要通过更改业务逻辑代码才能完成。

 


相关专题

更多
excel制作动态图表教程
excel制作动态图表教程

本专题整合了excel制作动态图表相关教程,阅读专题下面的文章了解更多详细教程。

20

2025.12.29

freeok看剧入口合集
freeok看剧入口合集

本专题整合了freeok看剧入口网址,阅读下面的文章了解更多网址。

65

2025.12.29

俄罗斯搜索引擎Yandex最新官方入口网址
俄罗斯搜索引擎Yandex最新官方入口网址

Yandex官方入口网址是https://yandex.com;用户可通过网页端直连或移动端浏览器直接访问,无需登录即可使用搜索、图片、新闻、地图等全部基础功能,并支持多语种检索与静态资源精准筛选。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

197

2025.12.29

python中def的用法大全
python中def的用法大全

def关键字用于在Python中定义函数。其基本语法包括函数名、参数列表、文档字符串和返回值。使用def可以定义无参数、单参数、多参数、默认参数和可变参数的函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

16

2025.12.29

python改成中文版教程大全
python改成中文版教程大全

Python界面可通过以下方法改为中文版:修改系统语言环境:更改系统语言为“中文(简体)”。使用 IDE 修改:在 PyCharm 等 IDE 中更改语言设置为“中文”。使用 IDLE 修改:在 IDLE 中修改语言为“Chinese”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

16

2025.12.29

C++的Top K问题怎么解决
C++的Top K问题怎么解决

TopK问题可通过优先队列、partial_sort和nth_element解决:优先队列维护大小为K的堆,适合流式数据;partial_sort对前K个元素排序,适用于需有序结果且K较小的场景;nth_element基于快速选择,平均时间复杂度O(n),效率最高但不保证前K内部有序。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

12

2025.12.29

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

134

2025.12.29

抖音网页版入口在哪(最新版)
抖音网页版入口在哪(最新版)

抖音网页版可通过官网https://www.douyin.com进入,打开浏览器输入网址后,可选择扫码或账号登录,登录后同步移动端数据,未登录仅可浏览部分推荐内容。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

63

2025.12.29

快手直播回放在哪看教程
快手直播回放在哪看教程

快手直播回放需主播开启功能才可观看,主要通过三种路径查看:一是从“我”主页进入“关注”标签再进主播主页的“直播”分类;二是通过“历史记录”中的“直播”标签页找回;三是进入“个人信息查阅与下载”里的“直播回放”选项。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

18

2025.12.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 4.1万人学习

Git 教程
Git 教程

共21课时 | 2.3万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号