首页 > 作文

Laravel服务容器绑定的几种方法总结

更新时间:2023-04-08 22:33:25 阅读: 评论:0

绑定基础

几乎所有的服务容器绑定都是在 服务提供者 中完成。

在目录结构如下图

注:如果一个类没有基于任何接口那么就没有必要将其绑定到容器。容器并不需要被告知如何构建对象,因为它会使用 php 的反射服务自动解析出具体的对象。

简单的绑定

在一个服务提供者中,可以通过 $this->app 变量访问容器,然后使用 bind 方法注册一个绑定,该方法需要两个参数,第一个参数是我们想要注册的类名或接口名称,第二个参数是返回类的实例的闭包:

 $this->app->bind('helpspot\api', function ($app) { return new helpspot\api($app->make('httpclient'));});

注意到我们将容器本身作为解析器的一个参数,然后我们可以使用该容器跑800米的技巧来解析我们正在构建的对象的子依赖。

绑定一个单例

singleton 方法绑定一个只会解析一次的类或接口到容器,然后接下来对容器的调用将会返回同一个对象实例:

$this->app->singleton('helpspot\api', function ($app) { return new helpspot\api($app->make('httpclient'));});

绑定当幸福来敲门英文原始值

你可能有一个接收注入类的类,同时需要注入一个原生的数值比如整型,可以结合上下文轻松注入这个类需要的任何值:

$this->app->when('app\http\controllers\urcontroller') ->needs('$variablename') ->give($value);

绑定接口到实现

服务容器的一个非常强大的功能是其绑定接口到实现。我们假设有一个 eventpusher 接口奥运会金牌榜2021及其实现类 rediventpusher ,编写完该接口的 rediventpusher 实现后,就可以将其注册到服务容器:

$this->app->bind( 'app\contracts\eventpusher',  'app\rvices\rediventpusher');

这段代码告诉容器当一个类需要 eventpusher 的实现时将会注入 rediventpusher,现在我们可以在构造器或者任何其它通过服务容器注入依赖的地方进行 eventpusher 接口的依赖注入:

u app\contracts\eventpusher;/** * 创建一个新的类实例 * * @param eventpusher $pusher * @return void */public function __construct(eventpusher $pusher){ $this->pusher = $pusher;}

上下文绑定

有时侯我们可能有两个类使用同一个接口,但我们希望在每个类中注入不同实现,例如,两个控制器依赖 illuminate\con国家法定假日有哪些tracts\filesystem\filesystem 契约的不同实现。laravel 为此定义了简单、平滑的接口:

u illuminate\support\facades\storage;u app\http\controllers\videocontroller;u app\http\controllers\photocontrollers;u 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(rvice::class, function($rvice) { return new decoratedrvice($rvice);});

总结

到此这篇关于laravel服务容器绑定的文章就介绍到这了,更多相关laravel服务容器绑定内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-08 22:33:24,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/95d04f6851e8e311dcc3c2045e2bfce0.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:Laravel服务容器绑定的几种方法总结.doc

本文 PDF 下载地址:Laravel服务容器绑定的几种方法总结.pdf

标签:绑定   容器   接口   方法
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图