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语法(5)
Oct 09 PHP
一些 PHP 管理系统程序中的后门
Aug 05 PHP
php foreach、while性能比较
Oct 15 PHP
php入门学习知识点七 PHP函数的基本应用
Jul 14 PHP
基于Zend的Captcha机制的应用
May 02 PHP
基于xcache的配置与使用详解
Jun 18 PHP
PHP 使用MySQL管理Session的回调函数详解
Jun 21 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
Jul 01 PHP
php使用wordwrap格式化文本段落的方法
Mar 17 PHP
详解WordPress中添加和执行动作的函数使用方法
Dec 29 PHP
PHP常用日期加减计算方法实例小结
Jul 31 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
Apr 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实现文件下载代码分享
2014/08/19 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
ThinkPHP安装和设置
2015/07/27 PHP
变量在 PHP7 内部的实现(一)
2015/12/21 PHP
PHP 实现公历日期与农历日期的互转换
2017/09/13 PHP
PHP开发实现快递查询功能详解
2019/04/08 PHP
使用Jquery打造最佳用户体验的登录页面的实现代码
2011/07/08 Javascript
javascript标签在页面中的位置探讨
2013/04/11 Javascript
如何使用Jquery获取Form表单中被选中的radio值
2013/08/09 Javascript
node.js中的console用法总结
2014/12/15 Javascript
javascript解析xml实现省市县三级联动的方法
2015/07/25 Javascript
浅谈Cookie的生命周期问题
2016/08/02 Javascript
JS实现鼠标滑过显示边框的菜单效果
2016/09/21 Javascript
Bootstrap中datetimepicker使用小结
2016/12/28 Javascript
JS使用正则截取两个字符串之间的字符串实现方法详解
2017/01/06 Javascript
JS实现汉字与Unicode码相互转换的方法详解
2017/04/28 Javascript
快速解决select2在bootstrap模态框中下拉框隐藏的问题
2018/08/10 Javascript
Vue中 v-if 和v-else-if页面加载出现闪现的问题及解决方法
2018/10/12 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
2018/11/21 Javascript
python之模拟鼠标键盘动作具体实现
2013/12/30 Python
在Python中关于中文编码问题的处理建议
2015/04/08 Python
Python 获取当前所在目录的方法详解
2017/08/02 Python
Python3实现购物车功能
2018/04/18 Python
python科学计算之numpy——ufunc函数用法
2019/11/25 Python
Python实现投影法分割图像示例(一)
2020/01/17 Python
skyn ICELAND官网:冰岛成分天然护肤品
2020/08/24 全球购物
一些Solaris面试题
2013/03/22 面试题
师范毕业生自荐信
2013/10/17 职场文书
演讲比赛的活动方案
2014/08/28 职场文书
八一建军节演讲稿
2014/09/10 职场文书
2015大学生实训报告
2014/11/05 职场文书
给老师的一封感谢信
2015/01/20 职场文书
继续教育心得体会(共6篇)
2016/01/19 职场文书
浅谈什么是SpringBoot异常处理自动配置的原理
2021/06/21 Java/Android
Tomcat执行startup.bat出现闪退的原因及解决办法
2022/04/20 Servers
SQL试题 使用窗口函数选出连续3天登录的用户
2022/04/24 Oracle