Laravel神奇的服务容器
Laravel的核心是IocContainer, 文档中称其为“服务容器”,服务容器是一个用于管理类依赖和执行依赖注入的强大工具,Laravel中的功能模块比如 Route、Eloquent ORM、Request、Response等等等等,实际上都是与核心无关的类模块提供的,这些类从注册到实例化,最终被我们所使用,其实都是 laravel 的服务容器负责的。
服务容器中有两个概念控制反转(IOC)和依赖注入(DI):
依赖注入和控制反转是对同一件事情的不同描述,它们描述的角度不同。依赖注入是从应用程序的角度在描述,应用程序依赖容器创建并注入它所需要的外部资源。而控制反转是从容器的角度在描述,容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。
在Laravel中框架把自带的各种服务绑定到服务容器,我们也可以绑定自定义服务到容器。当应用程序需要使用某一个服务时,服务容器会讲服务解析出来同时自动解决服务之间的依赖然后交给应用程序使用。
本篇就来探讨一下Laravel中的服务绑定和解析是如何实现的
服务绑定
常用的绑定服务到容器的方法有instance, bind, singleton, alias。下面我们分别来看一下。
instance
将一个已存在的对象绑定到服务容器里,随后通过名称解析该服务时,容器将总返回这个绑定的实例。
$api = new HelpSpot\API(new HttpClient);
$this->app->instance('HelpSpot\Api', $api);
会把对象注册到服务容器的$instances属性里
['HelpSpot\Api' => $api//$api是API类的对象,这里简写了
]
bind
绑定服务到服务容器
有三种绑定方式:
1.绑定自身
$this->app->bind('HelpSpot\API', null);2.绑定闭包
$this->app->bind('HelpSpot\API', function () {return new HelpSpot\API();
});//闭包直接提供类实现方式
$this->app->bind('HelpSpot\API', function ($app) {return new HelpSpot\API($app->make('HttpClient'));
});//闭包返回需要依赖注入的类
3. 绑定接口和实现
$this->app->bind('Illuminate\Tests\Container\IContainerContractStub', 'Illuminate\Tests\Container\ContainerImplementationStub');
bind把服务注册到服务容器的$bindings属性里类似这样:
$bindings = ['HelpSpot\API' => [//闭包绑定'concrete' => function ($app, $paramters = []) {return $app->build('HelpSpot\API');},'shared' => false//如果是singleton绑定,这个值为true] 'Illuminate\Tests\Container\IContainerContractStub' => [//接口实现绑定'concrete' => 'Illuminate\Tests\Container\ContainerImplementationStub','shared' => false]
]
singleton
public function singleton($abstract, $concrete = null)
{$this->bind($abstract, $concrete, true);
}
singleton 方法是bind方法的变种,绑定一个只需要解析一次的类或接口到容器,然后接下来对于容器的调用该服务将会返回同一个实例
alias
把服务和服务别名注册到容器:
public function alias($abstract, $alias)
{$this->aliases[$alias] = $this->normalize($abstract);
}
alias 方法在上面讲bind方法里有用到过,它会把把服务别名和服务类的对应关系注册到服务容器的$aliases属性里。例如:
$this->app->alias('\Illuminate\ServiceName', 'service_alias');
绑定完服务后在使用时就可以通过
$this->app->make('service_alias');
将服务对象解析出来,这样make的时候就不用写那些比较长的类名称了,对make方法的使用体验上有很大提升。
服务解析
服务解析是从服务容器中解析出在服务绑定过程中注册到服务容器里的对象,我们能过很方便的通过make方法来解析出服务对象,通过如果服务对象如果有依赖其他类对象的话服务容器也会帮助我们依次解决依赖从而免去了在程序里使用服务对象前先要在代码里实力化一堆依赖对象的繁重操作。
你可以点击“阅读原文”查看Laravel服务容器详细的源码解析,希望看完后能解决你在使用过程中的一些疑惑。
Laravel神奇的服务容器相关推荐
- laravel —— 神奇的服务容器
容器,字面上理解就是装东西的东西.常见的变量.对象属性等都可以算是容器.一个容器能够装什么,全部取决于你对该容器的定义.当然,有这样一种容器,它存放的不是文本.数值,而是对象.对象的描述(类.接口)或 ...
- Laravel核心解读--服务容器(IocContainer)
Laravel的核心是IocContainer, 文档中称其为"服务容器",服务容器是一个用于管理类依赖和执行依赖注入的强大工具,Laravel中的功能模块比如 Route.Elo ...
- php ico容器,Laravel 核心——IoC 服务容器
服务容器 Laravel 服务容器是一个用于管理类依赖和执行依赖注入的强大工具. 在理解这句话之前,我们需要先了解一下服务容器的来龙去脉: laravel神奇的服务容器.这篇博客告诉我们,服务容器就是 ...
- Laravel 学习笔记 —— 神奇的服务容器
原文地址: http://www.insp.top/learn-laravel-container ,转载务必保留来源,谢谢了! 容器,字面上理解就是装东西的东西.常见的变量.对象属性等都可以算是容器 ...
- Laravel开发:Laravel核心——Ioc服务容器源码解析(服务器绑定)
服务容器的绑定 bind 绑定 bind 绑定是服务容器最常用的绑定方式,在 上一篇文章中我们讨论过,bind 的绑定有三种: 绑定自身 绑定闭包 绑定接口 今天,我们这篇文章主要从源码上讲解 Ioc ...
- laravel服务容器-----深入理解控制反转(IoC)和依赖注入(DI)
首先大家想一想什么是容器,字面意思就是盛放东西的东西,常见的变量,对象属性都是容器,一个容器能够装什么东西,完全在于你对这个容器的定义.有的容器不仅仅只是存文本,变量,而是对象,属性,那么我们通过这种 ...
- laravel 服务容器,容器概念
Laravel 服务容器 发现一篇讲服务容器的文章,讲的很好,转载过来laravel 服务容器 实质是工厂模式的升级,类的传递动态加载 ####以下内容转载 容器,字面上理解就是装东西的东西.常见的变 ...
- Laravel服务容器
DI DI就是常说的依赖注入,那么究竟什么是依赖注入呢? 打个比方,电脑(非笔记本哈)需要键盘和鼠标我们才能进行操作,这个'需要'换句话说就是'依赖'键盘和鼠标. 那么,相应的,一个类需要另一个类才能 ...
- laravel 核心架构(1)服务容器-深入理解控制反转(IoC)和依赖注入(DI)
1. 介绍 laravel 容器 存放的 是对象.对象的描述(类.接口)或者是提供对象的回调,通过这种容器,我们得以实现许多高级的功能,其中最常提到的,就是 "解耦"." ...
最新文章
- re.split()用法详解
- Tensorflow— word2vec
- Lua 操作 MongoDB 数据库实例
- 【Findbugs】Findbugs使用指南
- 高级语言的编译过程和解释过程_进来了解一下C语言真正的编译过程看你掌握了吗?...
- Web前端三大主流框架是什么?Web前端前景与就业形势
- 外部数据源的使用汇总
- C# 解析 Json数据
- 关于vscode软件更换软件背景的问题
- python学习资源分享(编程基础_数据分析_机器学习模型_行业资讯)
- Java 实现倒数第一个斜杠和倒数第二个斜杠数据工具类
- 推荐网络带宽控制软件Netlimiter
- Matlab 让多图排版更美观
- 云计算期末习题含答案
- INFLUXDB-influxDB一些查询语法你必须知道
- UE4源码阅读_骨骼模型与动画系统_动画流程
- Linux中修改用户UID和组GID的方法
- 永远不要在MySQL中使用UTF-8
- 计算机速算训练,5种速算技巧,比计算机“更神速”!值得收藏!
- 【2022持续更新】大数据最全知识点整理-HDFS篇