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中GET变量的使用
Oct 09 PHP
php 数组二分法查找函数代码
Feb 16 PHP
PHP isset()与empty()的使用区别详解
Aug 29 PHP
php dirname(__FILE__) 获取当前文件的绝对路径
Jun 28 PHP
PHP数组操作汇总 php数组的使用技巧
Jul 17 PHP
php数组函数序列之array_combine() - 数组合并函数使用说明
Oct 29 PHP
PHP对象Object的概念 介绍
Jun 14 PHP
PHP中将ip地址转成十进制数的两种实用方法
Aug 15 PHP
php json与xml序列化/反序列化
Oct 28 PHP
Destoon实现多表查询示例
Aug 21 PHP
PHP折半(二分)查找算法实例分析
May 12 PHP
php+laravel依赖注入知识点总结
Nov 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
超神学院:鹤熙已踏入神圣领域,实力不比凯莎弱
2020/03/02 国漫
php数组函数序列之array_values() 获取数组元素值的函数与方法
2011/10/30 PHP
php 生成自动创建文件夹并上传文件的示例代码
2014/03/07 PHP
删除html标签得到纯文本可处理嵌套的标签
2014/04/28 PHP
php递归创建目录的方法
2015/02/02 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
几行代码轻松搞定jquery实现flash8类似的连接效果
2007/05/03 Javascript
JQuery获取样式中的background-color颜色值的问题
2013/08/20 Javascript
JavaScript实现同一页面内两个表单互相传值的方法
2015/08/12 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
关于js二维数组和多维数组的定义声明(详解)
2016/10/02 Javascript
原生js实现无缝轮播图效果
2017/01/11 Javascript
ExtJs的Ext.Ajax.request实现waitMsg等待提示效果
2017/06/14 Javascript
JS基于贪心算法解决背包问题示例
2017/11/27 Javascript
基于nodejs实现微信支付功能
2017/12/20 NodeJs
vue 中动态绑定class 和 style的方法代码详解
2018/06/01 Javascript
使用nvm和nrm优化node.js工作流的方法
2019/01/17 Javascript
vue.js实现备忘录demo
2019/06/26 Javascript
vue.js中ref和$refs的使用及示例讲解
2019/08/14 Javascript
Python3如何解决字符编码问题详解
2017/04/23 Python
python如何获取服务器硬件信息
2017/05/11 Python
python的构建工具setup.py的方法使用示例
2017/10/23 Python
基于python实现在excel中读取与生成随机数写入excel中
2018/01/04 Python
python中pylint使用方法(pylint代码检查)
2018/04/06 Python
如何使用Python标准库进行性能测试
2019/06/25 Python
将Pytorch模型从CPU转换成GPU的实现方法
2019/08/19 Python
房地产开盘策划方案
2014/02/10 职场文书
践行三严三实心得体会
2014/10/13 职场文书
清洁工个人总结
2015/03/04 职场文书
老员工辞职信范文
2015/05/12 职场文书
导游词之太湖
2019/10/08 职场文书
MySQL数据库索引的最左匹配原则
2021/11/20 MySQL
Win11怎样将锁屏账户头像图片改成动画视频
2021/11/21 数码科技
详解JavaScript的计时器和按钮效果设置
2022/02/18 Javascript
一级电子管军用接收机测评
2022/04/05 无线电
详细介绍python操作RabbitMq
2022/04/12 Python