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 dirname(__FILE__) 获取当前文件的绝对路径
Jun 28 PHP
php的数组与字符串的转换函数整理汇总
Jul 18 PHP
php设置session值和cookies的学习示例
Mar 21 PHP
php实现计数器方法小结
Jan 05 PHP
typecho插件编写教程(二):写一个新插件
May 28 PHP
PHP代码优化技巧小结
Sep 29 PHP
php关闭warning问题的解决方法
May 17 PHP
php curl中gzip的压缩性能测试实例分析
Nov 08 PHP
php str_getcsv把字符串解析为数组的实现方法
Apr 05 PHP
PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例
May 08 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
Apr 05 PHP
PHP设计模式之命令模式示例详解
Dec 20 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 文件上传源码分析(RFC1867)
2009/10/30 PHP
php压缩HTML函数轻松实现压缩html/js/Css及注意事项
2013/01/27 PHP
PHP后门隐藏的一些技巧总结
2020/11/04 PHP
JavaScript下通过的XMLHttpRequest发送请求的代码
2011/06/28 Javascript
js显示文本框提示文字的方法
2015/05/07 Javascript
angular.bind使用心得
2015/10/26 Javascript
javascript编程实现栈的方法详解【经典数据结构】
2017/04/11 Javascript
vue使用drag与drop实现拖拽的示例代码
2017/09/07 Javascript
React教程之封装一个Portal可复用组件的方法
2018/01/02 Javascript
Vue进度条progressbar组件功能
2018/04/17 Javascript
详解vue-cli@2.x项目迁移日志
2019/06/06 Javascript
vue cli4下环境变量和模式示例详解
2020/04/09 Javascript
JS实现移动端可折叠导航菜单(现代都市风)
2020/07/07 Javascript
vue cli 3.0通用打包配置代码,不分一二级目录
2020/09/02 Javascript
[51:29]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第一场 11.05
2020/11/05 DOTA
python实现类似ftp传输文件的网络程序示例
2014/04/08 Python
Python使用MD5加密字符串示例
2014/08/22 Python
python实现网站的模拟登录
2016/01/04 Python
Python基于回溯法子集树模板解决找零问题示例
2017/09/11 Python
python matplotlib绘图,修改坐标轴刻度为文字的实例
2018/05/25 Python
Python中property函数用法实例分析
2018/06/04 Python
Python多线程编程之多线程加锁操作示例
2018/09/06 Python
解决python中os.listdir()函数读取文件夹下文件的乱序和排序问题
2018/10/17 Python
关于pytorch处理类别不平衡的问题
2019/12/31 Python
使用CSS3制作倾斜导航条和毛玻璃效果
2017/09/12 HTML / CSS
基于Html5实现的语音搜索功能
2019/05/13 HTML / CSS
跑步爱好者一站式服务网站:Jack Rabbit
2016/09/01 全球购物
国际性能运动服装品牌:Dare 2b
2018/07/27 全球购物
英国健康和美容技术产品购物网站:CurrentBody
2019/07/17 全球购物
27个经典Linux面试题及答案,你知道几个?
2014/03/11 面试题
大四学生找工作的自荐信
2014/03/27 职场文书
给小学生的新年寄语
2014/04/04 职场文书
文秘班元旦晚会活动策划方案
2014/08/28 职场文书
小升初自荐信范文
2015/03/05 职场文书
2015年语文教师工作总结
2015/05/25 职场文书
vue中data里面的数据相互使用方式
2022/06/05 Vue.js