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加入ftp扩展的解决方法
Feb 07 PHP
『PHP』PHP截断函数mb_substr()使用介绍
Apr 22 PHP
Linux下安装oracle客户端并配置php5.3
Oct 12 PHP
使用Yii2实现主从数据库设置
Nov 20 PHP
PHP使用Redis实现防止大并发下二次写入的方法
Oct 09 PHP
php 二维数组快速排序算法的实现代码
Oct 17 PHP
PHP DB 数据库连接类定义与用法示例
Mar 11 PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
May 09 PHP
PHP面向对象类型约束用法分析
Jun 12 PHP
PHP实现基本留言板功能原理与步骤详解
Mar 26 PHP
is_file和file_exists效率比较
Mar 14 PHP
tp5使用layui实现多个图片上传(带附件选择)的方法实例
Nov 17 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
QueryPath PHP 中的jQuery
2010/04/11 PHP
php自定义错误处理用法实例
2015/03/20 PHP
PHP自毁程序(慎用)
2015/07/09 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
使用TextRange获取输入框中光标的位
2006/10/14 Javascript
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
jQuery源码分析-01总体架构分析
2011/11/14 Javascript
Google 地图控件集详解及实例代码
2016/08/06 Javascript
深入理解Angular中的依赖注入
2017/06/26 Javascript
微信小程序删除处理详解
2017/08/16 Javascript
浅谈AngularJs 双向绑定原理(数据绑定机制)
2017/12/07 Javascript
js实现以最简单的方式将数组元素添加到对象中的方法
2017/12/20 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
2018/09/21 Javascript
基于html+css+js实现简易计算器代码实例
2020/02/28 Javascript
ES6字符串的扩展实例
2020/12/21 Javascript
全面了解python字符串和字典
2016/07/07 Python
python2.7无法使用pip的解决方法(安装easy_install)
2018/04/03 Python
python与caffe改变通道顺序的方法
2018/08/04 Python
Django 多环境配置详解
2019/05/14 Python
Python代码实现http/https代理服务器的脚本
2019/08/12 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
2019/10/14 Python
Tensorflow限制CPU个数实例
2020/02/06 Python
Python脚本实现Zabbix多行日志监控过程解析
2020/08/26 Python
python如何实现word批量转HTML
2020/09/30 Python
详解Python模块化编程与装饰器
2021/01/16 Python
美国在线旅行社:Crystal Travel
2018/09/11 全球购物
The North Face北面德国官网:美国著名户外品牌
2018/12/12 全球购物
计算机专业职业生涯规划范文
2014/01/19 职场文书
安全责任书范文
2014/03/12 职场文书
保护母亲河倡议书
2014/04/14 职场文书
工会主席事迹材料
2014/06/03 职场文书
男方婚前保证书
2015/02/28 职场文书
2016抗战胜利71周年红领巾广播稿
2015/12/18 职场文书
导游词之重庆渣滓洞
2020/01/08 职场文书
基于Python实现流星雨效果的绘制
2022/03/18 Python
「回转企鹅罐」10周年纪念展「輪るピングドラム展」海报公开
2022/03/22 日漫