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生成xml简单实例代码
Dec 16 PHP
dedecms系统的广告设置代码 基础版本
Apr 09 PHP
用php实现百度网盘图片直链的代码分享
Nov 01 PHP
基于empty函数的输出详解
Jun 17 PHP
PHP goto语句简介和使用实例
Mar 11 PHP
微信API接口大全
Apr 15 PHP
PHP获取文件夹大小函数用法实例
Jul 01 PHP
几个优化WordPress中JavaScript加载体验的插件介绍
Dec 17 PHP
利用php-cli和任务计划实现刷新token功能的方法
May 03 PHP
Laravel模型间关系设置分表的方法示例
Apr 21 PHP
确保Laravel网站不会被嵌入到其他站点中的方法
Oct 18 PHP
phpstorm激活码2020附使用详细教程
Sep 25 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
8个出色的WordPress SEO插件收集
2011/02/26 PHP
PHP正则表达式 /i, /is, /s, /isU等介绍
2014/10/23 PHP
typecho插件编写教程(一):Hello World
2015/05/28 PHP
Yii2框架数据验证操作实例详解
2018/05/02 PHP
php7连接MySQL实现简易查询程序的方法
2020/10/13 PHP
List the Codec Files on a Computer
2007/06/18 Javascript
asp(javascript)全角半角转换代码 dbc2sbc
2009/08/06 Javascript
javascript 表单验证常见正则
2009/09/28 Javascript
javascript textarea光标定位方法(兼容IE和FF)
2011/03/12 Javascript
jQuery的选择器中的通配符[id^='code']或[name^='code']及jquery选择器总结
2015/12/24 Javascript
如何提高Dom访问速度
2017/01/05 Javascript
浅谈vuex之mutation和action的基本使用
2017/08/29 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
2018/12/21 Javascript
vue之debounce属性被移除及处理详解
2019/11/13 Javascript
Vue2.4+新增属性.sync、$attrs、$listeners的具体使用
2020/03/08 Javascript
[04:27]DOTA2官方论坛水友赛集锦
2013/09/16 DOTA
在Django的上下文中设置变量的方法
2015/07/20 Python
python模块之re正则表达式详解
2017/02/03 Python
Python标准库之collections包的使用教程
2017/04/27 Python
浅谈Python里面小数点精度的控制
2018/07/16 Python
Python中的支持向量机SVM的使用(附实例代码)
2019/06/26 Python
Python3 requests文件下载 期间显示文件信息和下载进度代码实例
2019/08/16 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
2020/06/28 Python
解决Python import .pyd 可能遇到路径的问题
2021/03/04 Python
Canvas与Image互相转换示例代码
2013/08/09 HTML / CSS
HTML5 图片悬停放大的实现代码示例
2019/12/04 HTML / CSS
Sephora丝芙兰马来西亚官方网站:国际化妆品购物
2018/03/15 全球购物
次世代生活态度:Hypebeast
2018/07/05 全球购物
Vuori官网:运动服装的终级表现
2021/01/27 全球购物
PHP如何调用MYSQL存储过程
2014/05/30 面试题
学校后勤岗位职责
2014/02/19 职场文书
文明社区申报材料
2014/08/21 职场文书
党性教育心得体会
2014/09/03 职场文书
团队会宣传标语
2014/10/09 职场文书
运动会广播稿300字
2015/08/19 职场文书
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python