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环境配置 php5 MySQL5 apache2 phpmyadmin安装与配置图文教程
Mar 16 PHP
数据库查询记录php 多行多列显示
Aug 15 PHP
Linux fgetcsv取得的数组元素为空字符串的解决方法
Nov 25 PHP
php二维数组排序与默认自然排序的方法介绍
Apr 27 PHP
php实现统计邮件大小的方法
Aug 06 PHP
php 判断是否是中文/英文/数字示例代码
Sep 30 PHP
CodeIgniter错误mysql_connect(): No such file or directory解决方法
Sep 06 PHP
简单介绍win7下搭建apache+php+mysql开发环境
Aug 06 PHP
Yii基于数组和对象的Model查询技巧实例详解
Dec 28 PHP
详解php中反射的应用
Mar 15 PHP
php 数组处理函数extract详解及实例代码
Nov 23 PHP
php设计模式之适配器模式原理、用法及注意事项详解
Sep 24 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
一个简单的域名注册情况查询程序
2006/10/09 PHP
php中取得URL的根域名的代码
2011/03/23 PHP
php从右向左/从左向右截取字符串的实现方法
2011/11/28 PHP
PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法
2017/08/11 PHP
PHP实现的堆排序算法详解
2017/08/17 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
Laravel + Elasticsearch 实现中文搜索的方法
2020/02/02 PHP
推荐dojo学习笔记
2007/03/24 Javascript
axios全局请求参数设置,请求及返回拦截器的方法
2018/03/05 Javascript
Vuex mutitons和actions初使用详解
2019/03/04 Javascript
通过layer实现可输入的模态框的例子
2019/09/27 Javascript
JS实现时间校验的代码
2020/05/25 Javascript
vue前端和Django后端如何查询一定时间段内的数据
2021/02/28 Vue.js
[48:05]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VGJ.T vs VP
2018/03/31 DOTA
Python smallseg分词用法实例分析
2015/05/28 Python
Python标准模块--ContextManager上下文管理器的具体用法
2017/11/27 Python
解决python os.mkdir创建目录失败的问题
2018/10/16 Python
Python 变量的创建过程详解
2019/09/02 Python
python写一个随机点名软件的实例
2019/11/28 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
2020/04/29 Python
完美解决pycharm 不显示代码提示问题
2020/06/02 Python
在Mac中配置Python虚拟环境过程解析
2020/06/22 Python
培训主管岗位职责
2014/02/01 职场文书
材料会计岗位职责
2014/03/06 职场文书
设计顾问服务计划书
2014/05/04 职场文书
红色故事演讲稿
2014/05/22 职场文书
医院党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
我的中国梦主题教育活动总结
2015/05/07 职场文书
故意伤害罪辩护词
2015/05/21 职场文书
谢师宴学生答谢词
2015/09/30 职场文书
Python djanjo之csrf防跨站攻击实验过程
2021/05/14 Python
nodejs利用readline提示输入内容实例代码
2021/07/15 NodeJs
Win11绿屏怎么办?Win11绿屏死机的解决方法
2021/11/21 数码科技
Nginx 反向代理解决跨域问题多种情况分析
2022/01/18 Servers
苹果的回收机器人可以通过拆解iPhone获取大量的金和铜并外公布了环境保护最新进展
2022/04/21 数码科技
pd.DataFrame中的几种索引变换的实现
2022/06/16 Python