原文链接:

https://stackoverflow.com/questions/37038830/what-is-the-concept-of-service-container-in-laravel#answer-37039108

Laravel中的服务容器是依赖注入容器,也是应用的注册器

在手工创建对象时,使用服务容器的优势是:

拥有对象创建时管理所需要的依赖的能力

你规定在应用中对象应该如何被创建,每次你需要去创建实例时,你只要管服务容器要,它将一并把必要的依赖问题解决并为你创建

比如,代替手工使用new关键字创建对象:

//每日次我们需要YourClass类时,我们需要手动传入一个依赖
$instance = new YourClass($dependency);

你可以在服务容器中注册一个绑定:

//为YourClass类添加一个绑定
App::bind( YourClass::class, function()
{
//做一些准备工作:创建一个必要的依赖
$dependency = new DepClass( config('some.value') ); //创建并且返回对象的依赖
return new YourClass( $dependency );
});

通过服务容器创建一个实例:

//没必要去创建YourClass类依赖,服务容器将为我们做!
$instance = App::make( YourClass::class );

接口绑定一个具体的类

使用Laravel自动依赖注入,当一个接口在应用中被需要时(比如在控制器的构造器),一个具体的类被服务容器自动实例化。在绑定时改变具体的类,将会应用中改变具体的实例化对象:

//每一次UserRepositoryInterface接口被请求,将会创建一个EloquentUserRepository类
App::bind( UserRepositoryInterface::class, EloquentUserRepository::class );

使用服务容器作为注册器

你可以在容器中创建并储存一个唯一的实例,并且之后获取它们:使用App::instance方法实现绑定,就可以使用容器作为注册器。

//创建一个实例
$kevin = new User('Kevin'); //绑定到服务容器。
App::instance('the-user', $kevin); //做一些其他事情 //获取对象实例
$kevin = App::make('the-user');

最后需要说明的是,实际上服务容器是一个应用对象:他继承自Container类,可以得到所有容器的方法

翻译 What is the concept of Service Container in Laravel?的更多相关文章

  1. Laravel之Service Container服务容器

    managing class dependencies and performing dependency injection. Dependency injection is a fancy phr ...

  2. 利用 Github Actions 的 service container 进行集成测试

    Github Action 中 Service Container 的使用 Intro 之前写过一个 StackExchange.Redis 的一个扩展,测试项目依赖 redis,所以之前测试一直只是 ...

  3. 翻译-使用Spring调用SOAP Web Service

    原文链接: http://spring.io/guides/gs/consuming-web-service/ 调用SOAP web service 本指南将指导你使用Spring调用一个基于SOAP ...

  4. 看过这些我明白了依赖注入及IoC

    背景 最近一段时间在学习laravel框架,了解到这个框架一个比较核心的概念就是服务容器,而服务容器似乎又和依赖注入有关系.但是碍于官方关于这方面的讲解篇幅过少,所以自学了一下. 自学的途径也跟大家一 ...

  5. kubeDNS workflow(service registration and discovery)

    Service discovery In k8s, we usually will more than make an application instance, and also the corre ...

  6. 翻译 - ASP.NET Core 基本知识 - 配置(Configuration)

    翻译自 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-5.0 ASP ...

  7. what is service?

    SERVICE n.服务,服侍:服务业:维修服务:服役 vt.检修,维修:向…提供服务:保养:满足需要 adj.服务性的:耐用的:服现役的 更多详情:http://dict.baidu.com/s?w ...

  8. Laravel 之Service Providers

    Service providers are the central place of all Laravel application bootstrapping. Your own applicati ...

  9. 基于.Net FrameWork的 RestFul Service

    关于本文 这篇文章的目的就是向大家阐述如何在.net framework 4.0中创建RestFul Service并且使用它. 什么是web Services,什么是WCF 首先讲到的是web Se ...

随机推荐

  1. MVC的实体模型写在类库,为什么被其他类库调用时,用不了模型的表?

    一,很简单,由于第一次添加实体模型时,VS会自动帮你添加引用System.Data.Entity到当前类库,如下图示: 二,而手动添加的类库并不存在这个引用,则及时你引用了当前的实体模型的类库,却使用 ...

  2. js中的script标签属性

    HTML <script> 元素用于嵌入或引用可执行脚本. 在html中插入一个script标签 <script src="index.js" sync cros ...

  3. 什么是restful风格?

    文章参考 RESTful API 设计指南--阮一峰 概念 一种软件架构风格.设计风格,而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更 ...

  4. ThinkPHP5.1x 中间件实现原理

    ThinkPHP5.1x的中间件,其核心还是闭包函数的应用,来实现“责任链”模式: 模拟代码: <?php //模拟的控制器 class Controller { public function ...

  5. SQL join的示意图

    SQL join 用于把来自两个或多个表的行结合起来. 下图展示了 LEFT JOIN.RIGHT JOIN.INNER JOIN.OUTER JOIN 相关的 7 种用法. 注意JOIN要和ON相连 ...

  6. Jmeter 将正则表达式提取的参数传给全局(跨线程组使用变量)

    一.使用正则表达式提取sessionId 1.在测试计划(跨线程组使用变量)--> 线程组(登录)--> 添加HTTP请求(登录接口) (1)创建测试计划: 勾选独立运行每个线程组(例如在 ...

  7. pod的状态分析

    Pod状态 状态 描述 Running 该 Pod 已经绑定到了一个节点上,Pod 中所有的容器都已被创建.至少有一个容器正在运行,或者正处于启动或重启状态. Pending Pod 已被 Kuber ...

  8. Python 获取当前文件所在路径

    记录几个os获取路径的函数 1. os.path.realpath(__file__):获取文件的绝对路径,包括文件自己的名字 2.os.path.dirname(path):获取path路径的上级路 ...

  9. 利用PHP和百度ai实现文本以及图片的审核

    步骤: 首先打开百度ai 开发平台 注册一个账号: 注册账号,进入控制台 创建自己的应用,获取apikey 和秘钥 进入文档页 文本审核: 图像审核: 代码实例: class Sentive { pr ...

  10. sparksql笔记

    1.sparksql是Spark用来处理结构化数据的一个模块,它提供了两个抽象DataFrame和DataSet并且作为分布式SQL查询引擎的作用. Hive SQL转换成MapReduce然后提交到 ...