Contracts, ServiceContainer, ServiceProvider, Facades关系

概念

  1. Contracts 合同,契约,也就是接口,定义一些规则,每个实现此接口的都要实现里面的方法

  2. ServiceContainer 实现Contracts,具体的逻辑实现

  3. ServiceProvider ServiceContainer的服务提供者,返回ServiceContainer的实例化,供其他地方使用,可以把它加入到app/config的provider中,会被自动注册到容器中

  4. Facades 简化ServiceProvider的调用方式,而且可以静态调用ServiceContainer中的方法

实现

Contracts接口可以写或不写,这里就不定义了定义一个ServiceContainer,实现具体的功能

namespace App\Helper;
class MyFoo{
public function add($a, $b)
{
return $a+$b;
}
}

定义一个ServiceProvider供其他地方使用ServiceContain

<?phpnamespace App\Providers;

use App\Helper\MyFoo; //要服务的Containeruse Illuminate\Support\ServiceProvider;
use App; class MyFooServiceProvider extends ServiceProvider{
public function boot(){}
//注册到容器中
public function register()
{
//可以这么绑定,这需要use App;
App::bind("myfoo",function(){
return new MyFoo();
});
//也可以这么绑定
$this->app->bind("myfoo", function(){
return new MyFoo();
});
}
}

在app/config.php中的providers数组中加入ServiceProvider,让系统自动注册

App\Providers\MyFooServiceProvider::class,

这时候就可以使用了,假设在控制器中使用

public function two($id=null){
//从系统容器中获取实例化对象
//app('myfoo')->add(1,2);
$myfoo = App::make("myfoo");
echo $myfoo->add(1,2);
}

这样太麻烦,还需要用make来获取对象,为了简便,就可以使用门面功能,定义门面MyFooFacade

namespace App\Facades;
use Illuminate\Support\Facades\Facade; class MyFooFacade extends Facade{
protected static function getFacadeAccessor()
{
//这里返回的是ServiceProvider中注册时,定义的字符串
return 'myfoo';
}
}

在控制器里就可以直接调用了

use App\Facades\MyFooFacade;
public function two($id=null){
//从系统容器中获取实例化对象
$myfoo = App::make("myfoo");
echo $myfoo->add(1,2);
//使用门面
echo MyFooFacade::add(4,5);
}

总的来说,自定义了一个类,为了方便在其他别处使用,便可以使用服务提供者和门面

----------------------------华丽的分割线----------------------------
简单的说,“服务容器”就是“服务提供者”提供的服务的容器,“服务容器”通过“服务提供者”来获取服务。
一个laravel应用就是一个“服务容器”,整个框架提供的各种功能由“服务提供者”提供并注入到“服务容器”中。每一个“服务提供者”里register的方法里面使用bind邦定某个对象到一个变量,那个对象就是真正提供服务的对象。

转自:https://segmentfault.com/a/1190000004965752#articleHeader4

【Laravel基础】laravel基础之相关概念,自定义服务提供者:Contracts, ServiceContainer, ServiceProvider, Facades关系的更多相关文章

  1. laravel中的Contracts, ServiceContainer, ServiceProvider, Facades关系

    Contracts, ServiceContainer, ServiceProvider, Facades  Contracts 合同,契约,也就是接口,定义一些规则,每个实现此接口的都要实现里面的方 ...

  2. laravel基础课程---1、laravel安装及基础介绍(laravel如何安装)

    laravel基础课程---1.laravel安装及基础介绍(laravel如何安装) 一.总结 一句话总结: [修改composer镜像地址].[明确laravel的安装要求].[安装指定版本的la ...

  3. 《零基础学习Python制作ArcGIS自定义工具》课程简介

    Python for ArcGIS Python for ArcGIS是借助Python语言实现ArcGIS自动化行为的综合,它不止是如课程标题所述的“制作ArcGIS自定义工具”,还包括使用Pyth ...

  4. 【SpringBoot 基础系列】实现一个自定义配置加载器(应用篇)

    [SpringBoot 基础系列]实现一个自定义配置加载器(应用篇) Spring 中提供了@Value注解,用来绑定配置,可以实现从配置文件中,读取对应的配置并赋值给成员变量:某些时候,我们的配置可 ...

  5. [.net 面向对象编程基础] (4) 基础中的基础——数据类型转换

    [.net面向对象编程基础] (4)基础中的基础——数据类型转换 1.为什么要进行数据转换? 首先,为什么要进行数据转换,拿值类型例子说明一下, 比如:我们要把23角零钱,换成2.30元,就需要把整形 ...

  6. JavaScript基础---语言基础(1)

    写在前面: 通过四篇博客把JS基础中的基础整理一下,方便自己查阅,这些内容对于实际项目开发中也许并不会在意,但是作为JS的语言基础,自觉还是应该熟悉.在完成这三篇博客(JavaScript基础---语 ...

  7. java基础内存基础详解

    堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令) 2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对 ...

  8. Golang 基础之基础语法梳理 (三)

    大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第三章节 Golang 基础之基础语法梳理 (一) Gol ...

  9. [.net 面向对象编程基础] (3) 基础中的基础——数据类型

    [.net 面向对象编程基础] (3) 基础中的基础——数据类型 关于数据类型,这是基础中的基础. 基础..基础..基础.基本功必须要扎实. 首先,从使用电脑开始,再到编程,电脑要存储数据,就要按类型 ...

随机推荐

  1. 【函数】Oracle函数系列(1)--字符函数

    [函数]Oracle函数系列(1)--字符函数 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识 ...

  2. mysql新加用户设置权限

    1.开通操作权限和表权限 GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON interface.* TO test1@'%' identif ...

  3. angular8中 如何引入两个echarts版本

    下载echarts2和echarts4的源码,然后在index.html中 1.先引入echarts4版本 2.然后引入echarts2版本 并且将echarts2源码中所有echarts 替换为ec ...

  4. Hibernate各种状态(瞬时状态、持久化状态、游离|托管状态)之间的转换

  5. asp.net中的参数传递:Context.Handler 的用法

    网上天天有人问怎么在webform页面之间传值,基本上来说,大家熟悉的是     (1)url字符串传值     (2)session传值     (3)直接读取server.transfer过来的页 ...

  6. Ueditor 自动设置上传图片的宽度或高度

    Uedior在上传图片的生活,需要自动设置上传图片的宽度或高度属性.该方法只能用于多图上传组件,单图上传无法使用. 该方法基于 ueditor 1.4.3 版本制作: 1.添加属性字段,在config ...

  7. C#WinForm程序异常退出的捕获、继续执行与自动重启

    本文参考网上搜索的信息,并做了适当修改可以让捕捉到异常之后阻止程序退出. 另给出了通过命令行自动重启的方法. 如果一个线程里运行下面的代码 ; / a; 将会导致程序自动结束,而且没有任何提示信息 但 ...

  8. 《团队名称》第八次团队作业:Alpha冲刺day3

    项目 内容 这个作业属于哪个课程 2016计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十二 团队作业8-软件测试与ALPHA冲刺 团队名称 快活帮 作业学习目标 (1)掌握 ...

  9. dart 使用

    用法 说明 print('xxx') 打印 == 比较相等 != 比较不等 语句后面必须加分号

  10. Java批量下载文件并zip打包

    客户需求:列表勾选需要的信息,点击批量下载文件的功能.这里分享下我们系统的解决方案:先生成要下载的文件,然后将其进行压缩,生成zip压缩文件,然后使用浏览器的下载功能即可完成批量下载的需求.以下是zi ...