【Laravel基础】laravel基础之相关概念,自定义服务提供者:Contracts, ServiceContainer, ServiceProvider, Facades关系
Contracts, ServiceContainer, ServiceProvider, Facades关系
概念
- Contracts 合同,契约,也就是接口,定义一些规则,每个实现此接口的都要实现里面的方法 
- ServiceContainer 实现Contracts,具体的逻辑实现 
- ServiceProvider ServiceContainer的服务提供者,返回ServiceContainer的实例化,供其他地方使用,可以把它加入到app/config的provider中,会被自动注册到容器中 
- 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关系的更多相关文章
- laravel中的Contracts, ServiceContainer, ServiceProvider, Facades关系
		Contracts, ServiceContainer, ServiceProvider, Facades Contracts 合同,契约,也就是接口,定义一些规则,每个实现此接口的都要实现里面的方 ... 
- laravel基础课程---1、laravel安装及基础介绍(laravel如何安装)
		laravel基础课程---1.laravel安装及基础介绍(laravel如何安装) 一.总结 一句话总结: [修改composer镜像地址].[明确laravel的安装要求].[安装指定版本的la ... 
- 《零基础学习Python制作ArcGIS自定义工具》课程简介
		Python for ArcGIS Python for ArcGIS是借助Python语言实现ArcGIS自动化行为的综合,它不止是如课程标题所述的“制作ArcGIS自定义工具”,还包括使用Pyth ... 
- 【SpringBoot 基础系列】实现一个自定义配置加载器(应用篇)
		[SpringBoot 基础系列]实现一个自定义配置加载器(应用篇) Spring 中提供了@Value注解,用来绑定配置,可以实现从配置文件中,读取对应的配置并赋值给成员变量:某些时候,我们的配置可 ... 
- [.net 面向对象编程基础] (4) 基础中的基础——数据类型转换
		[.net面向对象编程基础] (4)基础中的基础——数据类型转换 1.为什么要进行数据转换? 首先,为什么要进行数据转换,拿值类型例子说明一下, 比如:我们要把23角零钱,换成2.30元,就需要把整形 ... 
- JavaScript基础---语言基础(1)
		写在前面: 通过四篇博客把JS基础中的基础整理一下,方便自己查阅,这些内容对于实际项目开发中也许并不会在意,但是作为JS的语言基础,自觉还是应该熟悉.在完成这三篇博客(JavaScript基础---语 ... 
- java基础内存基础详解
		堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令) 2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对 ... 
- Golang 基础之基础语法梳理 (三)
		大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第三章节 Golang 基础之基础语法梳理 (一) Gol ... 
- [.net 面向对象编程基础] (3) 基础中的基础——数据类型
		[.net 面向对象编程基础] (3) 基础中的基础——数据类型 关于数据类型,这是基础中的基础. 基础..基础..基础.基本功必须要扎实. 首先,从使用电脑开始,再到编程,电脑要存储数据,就要按类型 ... 
随机推荐
- 《linux就该这么学》课堂笔记07 while、case、计划任务、用户增删改查命令
			while条件循环语句 while 条件测试操作 do 命令序列 done case条件测试语句 case 变量值 in 模式一) 命令序列1 ;; 模式二) 命令序列2 ;; *) 默认命令序列 ... 
- Linux下关于Qt无法调用fcitx的中文输入
			1 本机环境: deepin 15.11 Qt 5.11.3 fcitx 输入法 2 问题描述 Qt Creator 和使用 QT 编译的程序运行时均不能使用deepin系统自带的fcitx输入法,且 ... 
- linux设备驱动程序--在用户空间注册文件接口
			linux字符设备驱动程序--创建设备节点 基于4.14内核,运行在beagleBone green 在上一讲中,我们写了第一个linux设备驱动程序--hello_world,在驱动程序中,我们什么 ... 
- zabbix--显示插件Graphtree
			zabbix配置显示插件Graphtree 网盘下载地址:https://pan.baidu.com/s/1HGALOq2z7XiVRxyb6ASAeQ 提取码:13vn Graphtree 安装 ... 
- Solidity合约中的整数溢出漏洞事件
			事件 2018年4月23日 BEC 一夜被偷64亿 2018年4月25日 SMT 再爆类似漏洞,火币Pro和OKEx相继暂停了SMT交易 2018年4月25日 BEC.SMT现重大漏洞,这8个智能合约 ... 
- selenium安装
			pip安装 pqi优化pip下载速度 pip install selenium pip install --upgrade selenium pip show selenium 离线安装 官网下载se ... 
- dart 中的 try on catch
			catch 捕获异常 捕获了一个异常后,就停止了捕获异常过程.捕获一个异常,你就有机会去处理它: try { breedMoreLlamas(); } on OutOfLlamasException ... 
- 20180516模拟赛T1——queen
			题解 这题显然是\(总方案数不可行方案数总方案数-不可行方案数\)(直接算是无规则的).总方案数是\(n^2m^2\),于是问题就在于不可行的方案数. 若queen落在一个点上,则横竖是十分好求的(\ ... 
- MySQL - binlog日志简介及设置
			基本概念 binlog是Mysql sever层维护的一种二进制日志,与innodb引擎中的redo/undo log是完全不同的日志:其主要是用来记录对mysql数据更新或潜在发生更新的SQL语句, ... 
- 解决关于VC++ 6.0打开文件时,程序停止的问题
			不少boys和girls安装VC++ 6.0英文版后,开始学习C++语言,但是使用软件的过程中,点击“打开”时,就会出现程序进程错误,崩溃的事儿,很是郁闷.最后直接一个对话框如下: 并且vc6.0直接 ... 
