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 相关文章推荐
在VS2008中编译MYSQL5.1.48的方法
Jul 03 PHP
php抓取页面与代码解析 推荐
Jul 23 PHP
windows下zendframework项目环境搭建(通过命令行配置)
Dec 06 PHP
PHP与javascript实现变量交互的示例代码
Jul 23 PHP
PHP批量查询WordPress留言者E-mail地址实现方法
Feb 15 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
Aug 21 PHP
php版微信发红包接口用法示例
Sep 23 PHP
PHP+mysql+ajax轻量级聊天室实现方法详解
Oct 17 PHP
利用switch语句进行多选一判断的实例代码
Nov 14 PHP
PHP实现批量删除(封装)
Apr 28 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
Feb 27 PHP
PHP大文件及断点续传下载实现代码
Aug 18 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+AJAX实现无刷新注册(带用户名实时检测)
2007/01/02 PHP
PHP中strtotime函数使用方法分享
2012/01/10 PHP
phpmyadmin3 安装配置图解教程
2012/03/29 PHP
PHP获取当前完整URL地址的函数
2014/12/21 PHP
PHP中余数、取余的妙用
2015/06/29 PHP
纯PHP代码实现支付宝批量付款
2015/12/24 PHP
laravel 5.4中实现无限级分类的方法示例
2017/07/27 PHP
JavaScript调用堆栈及setTimeout使用方法深入剖析
2013/02/16 Javascript
javascript中字符串的定义示例代码
2013/12/19 Javascript
基于MVC4+EasyUI的Web开发框架形成之旅之界面控件的使用
2015/12/16 Javascript
jQuery ui autocomplete选择列表被Bootstrap模态窗遮挡的完美解决方法
2016/09/23 Javascript
原生Javascript插件开发实践
2017/01/18 Javascript
详解使用nvm安装node.js
2017/07/18 Javascript
Angular4自制一个市县二级联动组件示例
2017/11/21 Javascript
JavaScript读写二进制数据的方法详解
2018/09/09 Javascript
Vue动态修改网页标题的方法及遇到问题
2019/06/09 Javascript
axios 实现post请求时把对象obj数据转为formdata
2019/10/31 Javascript
vue+element table表格实现动态列筛选的示例代码
2021/01/14 Vue.js
使用selenium模拟登录解决滑块验证问题的实现
2019/05/10 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
2019/05/23 Python
Python获取好友地区分布及好友性别分布情况代码详解
2019/07/10 Python
Python3实现发送邮件和发送短信验证码功能
2020/01/07 Python
python golang中grpc 使用示例代码详解
2020/06/03 Python
Python+logging输出到屏幕将log日志写入文件
2020/11/11 Python
python中HTMLParser模块知识点总结
2021/01/25 Python
CSS3实现超酷的黑猫警长首页
2016/04/26 HTML / CSS
three.js模拟实现太阳系行星体系功能
2019/09/03 HTML / CSS
Hotels.com爱尔兰:全球酒店预订
2017/02/24 全球购物
英国赛车、汽车改装和摩托车零件购物网站:Demon Tweeks
2018/10/29 全球购物
在线实验室测试:HealthLabs.com
2020/05/03 全球购物
任课老师推荐信范文
2013/11/24 职场文书
小车司机岗位职责
2013/11/25 职场文书
大学生咖啡店创业计划书
2014/01/21 职场文书
2014年药店店长工作总结
2014/11/17 职场文书
手术室消毒隔离制度
2015/08/05 职场文书
MySQL的Query Cache图文详解
2021/07/01 MySQL