前言

刚开始看laravel服务容器、契约、服务提供器的确生涩难懂,不单单是概念繁多,而且实际的demo很难找(找是找到了,但难用啊),最后就隔一段时间看一遍,大概个十来遍,还真给看出个门道,废话少说上代码。

 

准备阶段

首先声明一下我的测试环境
php 7.2.4
laravel 5.6

 

1.创建新项目(composer)

在你的项目目录命令行运行:

composer create-project laravel/laravel laravelapp --prefer-dist
 

2.创建服务提供器

生成文件位于:项目/app/Providers/TestServiceProvider

php artisan make:provider TestServiceProvider

同时修改配置文件config/app.php,在providers数组中追加该服务提供器

'providers' => [
App\Providers\TestServiceProvider::class,
],
 

3.创建自己的工作目录(xiaocai)

我的工作目录在:项目/app/Xiaocai目录下
项目
   |---app
       |---Xiaocai
         |---DemoInterface.php
         |---DemoProvider.php
         |---DemoProvider2.php
写到这里你可能问我的工作目录下三个文件干什么用呢?不要着急,接下来我们逐个创建文件并进行讲解。
1:DemoInterface.php【接口文件】这个就是laravel中提到的Contracts(契约),使用接口(契约)的原因官方也给了说明:低耦合和简单性,文件内容如下:

<?php
namespace App\Xiaocai\Test;
interface DemoInterface
{
function demo1();
function demo2();
}

接口中只简单定义两个测试方法,记住带上命名空间App\Xiaocai\Test,这个很重要;
2:DemoProvider.php【接口实现类】,这个官方并没有特别说明,当然,有了接口当然会有对应的实现类去实现接口中的方法
文件内容如下:

<?php
namespace App\Xiaocai\Test;
class DemoProvider implements DemoInterface
{
public function demo1()
{
return 'demo1';
}
public function demo2()
{
return 'demo2';
}
}

对于这个实现类,我是这样理解的,laravel中的契约(接口)通过规定好方法名称,这样,第三方扩展包在想要实现这些契约方法的时候,必然要受到契约提供的方法的约束,防止滥用,使用户在使用laravel基础上的扩展包的时候,不必要再去了解底层代码逻辑,方法都是定义好的,尽管不同的包处理的逻辑不同,但是对于用户来说,都是调用的同一个方法,对于如何选择到底使用哪个实现类,我们也准备好了DemoProvider2.php类,他是DemoInterface.php的第二种实现方法。
3:DemoProvider2.php【接口实现类2】内容如下

<?php
namespace App\Xiaocai\Test;
class DemoProvider2 implements DemoInterface
{
public function demo1()
{
return 'demo1的第二种实现';
}
public function demo2()
{
return 'demo2的第二种实现';
}
}
 

4.创建测试控制器

命令行运行:

php artisan make:controller TestController
 

5.添加路由

未测试控制器添加一个测试路由,修改项目/routes/web.php文件,追加代码如下:

Route::get('/test', 'TestController@index');
 

6.修改服务提供器文件(TestServiceProvider)

这里是重点!这里是重点!这里是重点!重要的事情我只说三遍

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Xiaocai\Test\DemoInterface;
use App\Xiaocai\Test\DemoProvider;
use App\Xiaocai\Test\DemoProvider2; class TestServiceProvider extends ServiceProvider
{
public function boot()
{
}
public function register()
{
$this->app->bind(DemoInterface::class, DemoProvider2::class);
}
}

在这里就可以对想要使用的实现接口(契约)类进行选择,$this->app->bind(arg1, arg2);参数1代表接口类,参数2代表要使用的接口实现类,你可以在这里进行切换选择实现类,切换之后如何验证呢?

 

验证

修改TestController文件

<?php
namespace App\Http\Controllers; use Illuminate\Http\Request;
use App\Xiaocai\Test\DemoInterface;//注意引用的是接口文件,并非实现类 class TestController extends Controller
{
public function index(DemoInterface $demo)
{
dd($demo->demo1());
}
}

此时浏览器输出接口不出意外的话应该是这样的:

 

我们不妨修改一下实现类,在TestServiceProvider文件中修改如下:

$this->app->bind(DemoInterface::class, DemoProvider::class);
//$this->app->bind(DemoInterface::class, DemoProvider2::class);

此时再运行,如下:

 
 

总结

如此一来,切换实现的方法是不是很简单,只需要在服务提供器中修改即可,果真是低耦合。如果文章中出现什么纰漏欢迎指出,防止祸害他人,如果觉得对您有帮助的话,点个赞支持一下吧。

 

结语

另外Xiaocai工作目录是测试用的,当然如果做项目的话,你也可以把你的代码上传到composer,这样通过composer直接引入到vendor目录下,通过composer的自动加载机制,这样是不是更能提高你的效率呢。

Laravel 服务容器、服务提供器、契约实例讲解的更多相关文章

  1. Python函数篇(5)-装饰器及实例讲解

    1.装饰器的概念   装饰器本质上就是一个函数,主要是为其他的函数添加附加的功能,装饰器的原则有以下两个: 装饰器不能修改被修饰函数的源代码 装饰器不能修改被修改函数的调用方式   装饰器可以简单的理 ...

  2. laravel 服务容器实现原理

    前言 通过实现laravel 框架功能,以便深入理解laravel框架的先进思想. 什么是服务容器 服务容器是用来管理类依赖与运行依赖注入的工具.Laravel框架中就是使用服务容器来实现 ** 控制 ...

  3. Laravel 服务容器,IoC,DI

    DI DI 就是常说的依赖注入,那么究竟什么是依赖注入呢? 打个比方,电脑(非笔记本哈)需要键盘和鼠标我们才能进行操作,这个‘需要’换句话说就是‘依赖’键盘和鼠标. 那么,相应的,一个类需要另一个类才 ...

  4. php--理解PHP的依赖注入和laravel的服务容器

    写在前面 为了了解laravel的服务容器在网上搜了许多文章,其中大多数都有其侧重点,没有很系统的一套东西以供参考,看完之后仍觉似乎少了一根把他们串起来的绳子,近期有幸拜读了陈昊的<Larave ...

  5. Laravel 配置 SqlDebug 服务,进行实时监听打印 SQL

    0:释义 什么是服务容器 简而言之,Laravel 服务容器 是一个用于存储绑定组件的盒子,它还会为应用提供所需的服务. Laravel 服务容器是用于管理类的依赖和执行依赖注入的工具,By Lara ...

  6. QService 服务容器

    原理 服务容器 服务主体,反射执行业务类 管理器 对服务容器进行控制 测试服务 向一个文件写入内容 启用一个HTTP服务 以下为日志: 2015-06-15 11:50:47.5313 Info QS ...

  7. Laravel 服务容器实例教程 —— 深入理解控制反转(IoC)和依赖注入(DI)

    容器,字面上理解就是装东西的东西.常见的变量.对象属性等都可以算是容器.一个容器能够装什么,全部取决于你对该容器的定义.当然,有这样一种容器,它存放的不是文本.数值,而是对象.对象的描述(类.接口)或 ...

  8. laravel 服务容器实例——深入理解IoC模式

    刚刚接触laravel,对于laravel的服务容器不是很理解.看了<Laravel框架关键技术解析>和网上的一些资料后对于服务容器有了一些自己的理解,在这里分享给大家 1.依赖 IoC模 ...

  9. laravel5.5服务提供器

    目录 1. 编写服务提供器 1.1 注册方法 register 1.1.1 简单绑定 1.1.2 绑定单例 1.1.3 绑定实例 1.1.4 绑定初始数据 1.2 引导方法 boot 2. 注册服务提 ...

随机推荐

  1. Automatically migrating data to new machines kafka集群扩充迁移topic

    The partition reassignment tool can be used to move some topics off of the current set of brokers to ...

  2. js开发打印证书功能(二)

    在上一篇的基础上,实现了一下另外一种方式. 上一篇地址:https://www.cnblogs.com/ljwsyt/p/9525290.html 首先,该方式也是有几种方法. 1.在上一篇的基础上, ...

  3. linux 下的启动项

    /etc/profile  这个也是启动脚本.而且优先级很高哦.. 以下都是网上找来的 (1)编辑文件 /etc/rc.local 输入命令:vim /etc/rc.local 将出现类似如下的文本片 ...

  4. [SDOI2008]递归数列

    嘟嘟嘟 裸的矩阵快速幂,构造一个\((k + 1) * (k + 1)\)的矩阵,把sum[n]也放到矩阵里面就行了. #include<cstdio> #include<iostr ...

  5. filter 实现登录状态控制

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 网站需要做用户登录鉴权控制,没有登录的话,不能访问网站,提示需要登录. 实现方式: 使 ...

  6. 【js】使用javascript 实现静态网页分页效果

    <!DOCTYPE html> <html> <head> <meta http-equiv="content-Type" content ...

  7. python3 列表/字典/集合推导式

    '''列表推导式[结果 fox循环 if语句]'''lst = ["Python周末%s期" % i for i in range(1, 27) if i%2 == 0]print ...

  8. RMQ问题--范围最小值问题

    范围最小值问题(Range Minium Query,RMQ)---RMQ问题 一.一维问题 给出一个n个元素的数组A1,A2,...,An, 设计一个数据结构, 支持查询操作Query(L,R):计 ...

  9. OpenCV3计算机视觉Python语言实现笔记(二)

    1. 图像与原始字节之间的转换 从概念上讲,一个字节能表示0到255的整数.目前,对于多有的实时图像应用而言,虽然有其他的表示形式,但一个像素通常由每个通道的一个字节表示. 一个OpenCV图像是.a ...

  10. STM32中断优先级彻底讲解

    一.综述      STM32 目前支持的中断共为 84 个(16 个内核+68 个外部), 16 级可编程中断优先级的设置(仅使用中断优先级设置 8bit 中的高 4 位)和16个抢占优先级(因为抢 ...