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仿ZOL分页类代码
Oct 02 PHP
php自动加载的两种实现方法
Jun 21 PHP
PHP将两个关联数组合并函数提高函数效率
Mar 18 PHP
ThinkPHP字符串函数及常用函数汇总
Jul 18 PHP
Yii配置文件用法详解
Dec 04 PHP
php结合安卓客户端实现查询交互实例
May 05 PHP
PHP下载生成的csv文件及问题总结
Aug 06 PHP
php+ajax注册实时验证功能
Jul 20 PHP
PHP+JS实现的商品秒杀倒计时用法示例
Nov 15 PHP
PHP实现微信商户支付企业付款到零钱功能
Sep 30 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
Oct 21 PHP
php+ajax实现文件切割上传功能示例
Mar 03 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 无限级分类学习参考之对ecshop无限级分类的解析 带详细注释
2010/03/23 PHP
浅析ThinkPHP中的pathinfo模式和URL重写
2014/01/06 PHP
解密ThinkPHP3.1.2版本之模板继承
2014/06/19 PHP
PHP如何通过AJAX方式实现登录功能
2015/11/23 PHP
Joomla语言翻译类Jtext用法分析
2016/05/05 PHP
jquery统计复选框选中示例
2013/11/05 Javascript
jquery 漂亮的删除确认和提交无刷新删除示例
2013/11/13 Javascript
jQuery聚合函数实例
2015/05/21 Javascript
js实现三张图(文)片一起切换的banner焦点图
2015/08/25 Javascript
AngularJS监听路由变化的方法
2017/03/07 Javascript
浅谈通过JS拦截 pushState和replaceState事件
2017/07/21 Javascript
js实现日期显示的一些操作(实例讲解)
2017/07/27 Javascript
解决vue 按钮多次点击重复提交数据问题
2018/05/10 Javascript
微信小程序云开发 生成带参小程序码流程
2019/05/18 Javascript
Vue.js项目实战之多语种网站的功能实现(租车)
2019/08/07 Javascript
vue仿ios列表左划删除
2019/09/26 Javascript
JS性能优化实现方法及优点进行
2020/08/30 Javascript
jquery实现简单每周轮换的日历
2020/09/10 jQuery
vue3.0 加载json的方法(非ajax)
2020/10/26 Javascript
[02:49]2014DOTA2电竞也是体育项目! 势要把荣誉带回中国!
2014/07/20 DOTA
使用 Python 获取 Linux 系统信息的代码
2014/07/13 Python
Python引用类型和值类型的区别与使用解析
2017/10/17 Python
详解Django之auth模块(用户认证)
2018/04/17 Python
详解重置Django migration的常见方式
2019/02/15 Python
python中嵌套函数的实操步骤
2019/02/27 Python
Python编写打字训练小程序
2019/09/26 Python
Python第三方库的几种安装方式(小结)
2020/04/03 Python
完美解决keras保存好的model不能成功加载问题
2020/06/11 Python
网站开发实习生的自我评价
2013/12/11 职场文书
后勤服务中心总经理工作职责
2014/03/03 职场文书
销售内勤岗位职责
2014/04/15 职场文书
婚前财产协议书范本
2014/10/19 职场文书
保证书格式
2015/01/16 职场文书
共青团员自我评价
2015/03/10 职场文书
当幸福来敲门英文观后感
2015/06/01 职场文书
再谈python_tkinter弹出对话框创建
2022/03/20 Python