200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > Laravel Service Providers 绑定多个实现 在依赖注入的时候 怎么确定是实例化的哪一个类?

Laravel Service Providers 绑定多个实现 在依赖注入的时候 怎么确定是实例化的哪一个类?

时间:2019-02-16 03:20:24

相关推荐

Laravel Service Providers 绑定多个实现 在依赖注入的时候 怎么确定是实例化的哪一个类?

后端开发|php教程

laravel,php

后端开发-php教程

后台管理源码,怎么把vscode搬到浏览器,ubuntu 系统 界面,tomcat5.5安装不了,sqlite 字段备注,网页设计div,服务器端口怎么开放端口,织梦上传视频插件,前端开发框架 免费,防爬虫论文,php权限管理系统,北京seo站内优化,springboot虚拟机参数,帝国cms的手机网站,html网页留言板,webapp 模板,magento后台修改订单状态,jq页面滑动动画,用java做学生成绩管理系统,java聊天小程序源代码lzw

interface Pay { public function run();}class Weixin implements Pay { public function run() { echo weixin; }}class Ali implements Pay { public function run() { echo ali; }}class PayServiceProvider extends ServiceProvider{ public function register() { $this->app->singleton(weixin, function () { return new Weixin; }); $this->app->singleton(ali, function () { return new Ali; }); }}class A{ // 这里注入应该填入什么参数? 怎么确定注入的是哪个类的实例 public functions __construct(Pay $pay) { }}

建站源码网iis,vscode下什么版本,ubuntu 16 美化,tomcat看war包,sqlite数据库能联网吗,爬虫能绕过验证码直接下载吗,php数字函数,鞍山seo优化排名报价,php网站病毒,红色资讯dedecms模板lzw

回复内容:

插件源码网,ubuntu上开机启动,tomcat8页面空白,爬虫自动汇总邮件,php让输出结果从高到低排序,seo优化制作lzw

interface Pay { public function run();}class Weixin implements Pay { public function run() { echo weixin; }}class Ali implements Pay { public function run() { echo ali; }}class PayServiceProvider extends ServiceProvider{ public function register() { $this->app->singleton(weixin, function () { return new Weixin; }); $this->app->singleton(ali, function () { return new Ali; }); }}class A{ // 这里注入应该填入什么参数? 怎么确定注入的是哪个类的实例 public functions __construct(Pay $pay) { }}

首先,你对服务容器(Service Container)的行为理解有误!

第一,通过绑定服务ID的方式定义的服务,只能通过服务ID来获取,如下:

// 定义服务$this->app->singleton(service_id, function () { return new Service();})// 获取服务,以下方式等价$this->app->make(service_id);$this->app[service_id];

第二,你想通过接口的类型提示(Type Hint)来自动解析并注入服务,需要像下边这样:

// 绑定接口到实例$this->app->bind(Namespace\To\Your\Interface\Pay, Namespace\To\Your\Class\Weixin);

如果你需要注入服务的对象是通过服务容器(Service Container)来解析的,才可以使用类型提示(Type Hint)来进行自动解析并注入服务。以下这些类的实例都是通过服务容器来解析的:controllers, event listeners, queue jobs, middleware等,以及自己绑定到服务容器(Service Container)的服务。

第三,像上边这样,通过绑定接口到实例,只能自动解析为一个实例,也就是你绑定的实例;如果你想要的结果是,不同的类,构造器通过类型提示(Type Hint)相同的接口,注入不同的实例,可以像下边这样(上下文绑定,Context Binding):

$this->app->when(Namespace\To\Your\Class\A)->needs(Namespace\To\Your\Interface\Pay)->give(Namespace\To\Your\Class\Weixin);$this->app->when(Namespace\To\Your\Class\B)->needs(Namespace\To\Your\Interface\Pay)->give(Namespace\To\Your\Class\Ali);

通过上下文绑定,A的实例会注入Weixin的实例,而B的实例会注入Ali的实例。像下边:

class A{ public functions __construct(Pay $pay) { var_dump($pay instanceof Weixin); // True }}class B{ public functions __construct(Pay $pay) { var_dump($pay instanceof Ali); // True }}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。