原文链接:

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类,可以得到所有容器的方法

最新文章

  1. 窥探Swift之基本数据类型
  2. Android高手速成
  3. centos,nginx安装备忘
  4. 我见过的 Objective-C, 讲的最通俗易懂的入门教程....
  5. apt-cache madison package-name
  6. Android学习----AndroidManifest.xml文件解析
  7. Handler消息源代码分析
  8. CSS的兼容性与BUG处理
  9. dotnet core 2.0在ubuntu下安装失败
  10. 常用YUV转RGB代码
  11. Linux压缩命令总结
  12. linux gcc 静态 动态链接库
  13. php防范
  14. js获取iframe中的元素
  15. CentOS6.5 QT5.3 找不到GLIBCXX3.4.15解决方法
  16. UVA 11136 Hoax or what (multiset)
  17. Multipart polyline to single part lines
  18. plsql programming 01 plsql概述
  19. 调用组件的C++代码
  20. pat02-线性结构4. Pop Sequence (25)

热门文章

  1. 在$CF$水题の记录
  2. MyEclipse安装jrebel7.0.2插件
  3. 2019牛客暑期多校训练营(第七场)E F H I
  4. vue 点击当前元素改变样式
  5. 深度学习练手项目——DNN识别手写数字
  6. Vue.js(七)
  7. Python基础教程(007)--Python的优缺点
  8. element-ui 复选框,实现点击表格当前行选中或取消
  9. BZOJ 2653: middle(主席树+二分答案)
  10. 安装ISS服务