Laravel服务容器绑定的几种方法总结


Posted in PHP onJune 14, 2020

绑定基础

几乎所有的服务容器绑定都是在 服务提供者 中完成。

在目录结构如下图

Laravel服务容器绑定的几种方法总结

注:如果一个类没有基于任何接口那么就没有必要将其绑定到容器。容器并不需要被告知如何构建对象,因为它会使用 PHP 的反射服务自动解析出具体的对象。

简单的绑定

在一个服务提供者中,可以通过 $this->app 变量访问容器,然后使用 bind 方法注册一个绑定,该方法需要两个参数,第一个参数是我们想要注册的类名或接口名称,第二个参数是返回类的实例的闭包:

$this->app->bind('HelpSpot\API', function ($app) {
 return new HelpSpot\API($app->make('HttpClient'));
});

注意到我们将容器本身作为解析器的一个参数,然后我们可以使用该容器来解析我们正在构建的对象的子依赖。

绑定一个单例

singleton 方法绑定一个只会解析一次的类或接口到容器,然后接下来对容器的调用将会返回同一个对象实例:

$this->app->singleton('HelpSpot\API', function ($app) {
 return new HelpSpot\API($app->make('HttpClient'));
});

绑定原始值

你可能有一个接收注入类的类,同时需要注入一个原生的数值比如整型,可以结合上下文轻松注入这个类需要的任何值:

$this->app->when('App\Http\Controllers\UserController')
 ->needs('$variableName')
 ->give($value);

绑定接口到实现

服务容器的一个非常强大的功能是其绑定接口到实现。我们假设有一个 EventPusher 接口及其实现类 RedisEventPusher ,编写完该接口的 RedisEventPusher 实现后,就可以将其注册到服务容器:

$this->app->bind(
 'App\Contracts\EventPusher', 
 'App\Services\RedisEventPusher'
);

这段代码告诉容器当一个类需要 EventPusher 的实现时将会注入 RedisEventPusher,现在我们可以在构造器或者任何其它通过服务容器注入依赖的地方进行 EventPusher 接口的依赖注入:

use App\Contracts\EventPusher;

/**
 * 创建一个新的类实例
 *
 * @param EventPusher $pusher
 * @return void
 */
public function __construct(EventPusher $pusher){
 $this->pusher = $pusher;
}

上下文绑定

有时侯我们可能有两个类使用同一个接口,但我们希望在每个类中注入不同实现,例如,两个控制器依赖 Illuminate\Contracts\Filesystem\Filesystem 契约的不同实现。Laravel 为此定义了简单、平滑的接口:

use Illuminate\Support\Facades\Storage;
use App\Http\Controllers\VideoController;
use App\Http\Controllers\PhotoControllers;
use Illuminate\Contracts\Filesystem\Filesystem;

$this->app->when(PhotoController::class)
 ->needs(Filesystem::class)
 ->give(function () {
 return Storage::disk('local');
 });

$this->app->when(VideoController::class)
 ->needs(Filesystem::class)
 ->give(function () {
 return Storage::disk('s3');
 });

标签

少数情况下,我们需要解析特定分类下的所有绑定,例如,你正在构建一个接收多个不同 Report 接口实现的报告聚合器,在注册完 Report 实现之后,可以通过 tag 方法给它们分配一个标签:

$this->app->bind('SpeedReport', function () {
 //
});

$this->app->bind('MemoryReport', function () {
 //
});

$this->app->tag(['SpeedReport', 'MemoryReport'], 'reports');

这些服务被打上标签后,可以通过 tagged 方法来轻松解析它们:

$this->app->bind('ReportAggregator', function ($app) {
 return new ReportAggregator($app->tagged('reports'));
});

扩展绑定

extend 方法允许对解析服务进行修改。例如,当服务被解析后,可以运行额外代码装饰或配置该服务。extend 方法接收一个闭包来返回修改后的服务:

$this->app->extend(Service::class, function($service) {
 return new DecoratedService($service);
});

总结

到此这篇关于Laravel服务容器绑定的文章就介绍到这了,更多相关Laravel服务容器绑定内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
PHP中array_merge和array相加的区别分析
Jun 17 PHP
PHP将回调函数作用到给定数组单元的方法
Aug 19 PHP
PHP闭包实例解析
Sep 08 PHP
CI框架验证码CAPTCHA辅助函数用法实例
Nov 05 PHP
php的dl函数用法实例
Nov 06 PHP
php函数serialize()与unserialize()用法实例
Nov 06 PHP
Symfony页面的基本创建实例详解
Jan 26 PHP
Laravel 5框架学习之向视图传送数据
Apr 08 PHP
php实现的简单美国商品税计算函数
Jul 13 PHP
PHP简单获取及判断提交来源的方法
Apr 22 PHP
php实现mysql连接池效果实现代码
Jan 25 PHP
PHP使用DOM对XML解析处理操作示例
Jul 04 PHP
Laravel如何实现适合Api的异常处理响应格式
Jun 14 #PHP
Yii redis集合的基本使用教程
Jun 14 #PHP
php获取小程序码的实现代码(B类接口)
Jun 13 #PHP
laravel admin实现分类树/模型树的示例代码
Jun 10 #PHP
详解php反序列化
Jun 10 #PHP
实例讲解PHP表单
Jun 10 #PHP
如何在PHP中使用数组
Jun 09 #PHP
You might like
PHP实现微信提现功能
2018/09/30 PHP
PHP iconv()函数字符编码转换的问题讲解
2019/03/22 PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
2019/04/02 PHP
DOM 基本方法
2009/07/18 Javascript
早该知道的7个JavaScript技巧
2013/03/27 Javascript
使用Grunt.js管理你项目的应用说明
2013/04/24 Javascript
表单类各种类型(文本框)失去焦点效果jquery代码
2013/04/26 Javascript
Jquery中的层次选择器与find()的区别示例介绍
2014/02/20 Javascript
详解nodejs 文本操作模块-fs模块(四)
2016/12/22 NodeJs
JavaScript实现时钟滴答声效果
2017/01/29 Javascript
微信小程序遇到修改数据后页面不渲染的问题解决
2017/03/09 Javascript
jQuery实现可拖动进度条实例代码
2017/06/21 jQuery
NW.js 简介与使用方法
2018/02/01 Javascript
vue单个组件实现无限层级多选菜单功能
2018/04/10 Javascript
vue项目搭建以及全家桶的使用详细教程(小结)
2018/12/19 Javascript
vue引用外部JS的两种种方法
2020/01/28 Javascript
vue实现列表滚动的过渡动画
2020/06/29 Javascript
Vue中ref和$refs的介绍以及使用方法示例
2021/01/11 Vue.js
Python创建日历实例
2014/08/21 Python
使用Python3中的gettext模块翻译Python源码以支持多语言
2015/03/31 Python
使用python调用zxing库生成二维码图片详解
2017/01/10 Python
python 计算数组中每个数字出现多少次--“Bucket”桶的思想
2017/12/19 Python
CentOS下Python3的安装及创建虚拟环境的方法
2018/11/28 Python
Django restframework 源码分析之认证详解
2019/02/22 Python
Python实现操纵控制windows注册表的方法分析
2019/05/24 Python
关于Tensorflow使用CPU报错的解决方式
2020/02/05 Python
Python使用lambda抛出异常实现方法解析
2020/08/20 Python
大学生毕业求职找工作的自我评价
2013/09/29 职场文书
教师年度考核自我鉴定
2014/01/19 职场文书
平面设计专业大学生职业规划书
2014/03/12 职场文书
小学教师师德承诺书
2014/05/23 职场文书
做一个有道德的人活动方案
2014/08/25 职场文书
2015年党日活动总结范文
2015/03/25 职场文书
2015年全国助残日活动方案
2015/05/04 职场文书
2015年公司中秋节致辞
2015/07/31 职场文书
2019求职信大礼包
2019/05/15 职场文书