Laravel 服务容器、服务提供器、契约实例讲解
前言
刚开始看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 服务容器、服务提供器、契约实例讲解的更多相关文章
- Python函数篇(5)-装饰器及实例讲解
1.装饰器的概念 装饰器本质上就是一个函数,主要是为其他的函数添加附加的功能,装饰器的原则有以下两个: 装饰器不能修改被修饰函数的源代码 装饰器不能修改被修改函数的调用方式 装饰器可以简单的理 ...
- laravel 服务容器实现原理
前言 通过实现laravel 框架功能,以便深入理解laravel框架的先进思想. 什么是服务容器 服务容器是用来管理类依赖与运行依赖注入的工具.Laravel框架中就是使用服务容器来实现 ** 控制 ...
- Laravel 服务容器,IoC,DI
DI DI 就是常说的依赖注入,那么究竟什么是依赖注入呢? 打个比方,电脑(非笔记本哈)需要键盘和鼠标我们才能进行操作,这个‘需要’换句话说就是‘依赖’键盘和鼠标. 那么,相应的,一个类需要另一个类才 ...
- php--理解PHP的依赖注入和laravel的服务容器
写在前面 为了了解laravel的服务容器在网上搜了许多文章,其中大多数都有其侧重点,没有很系统的一套东西以供参考,看完之后仍觉似乎少了一根把他们串起来的绳子,近期有幸拜读了陈昊的<Larave ...
- Laravel 配置 SqlDebug 服务,进行实时监听打印 SQL
0:释义 什么是服务容器 简而言之,Laravel 服务容器 是一个用于存储绑定组件的盒子,它还会为应用提供所需的服务. Laravel 服务容器是用于管理类的依赖和执行依赖注入的工具,By Lara ...
- QService 服务容器
原理 服务容器 服务主体,反射执行业务类 管理器 对服务容器进行控制 测试服务 向一个文件写入内容 启用一个HTTP服务 以下为日志: 2015-06-15 11:50:47.5313 Info QS ...
- Laravel 服务容器实例教程 —— 深入理解控制反转(IoC)和依赖注入(DI)
容器,字面上理解就是装东西的东西.常见的变量.对象属性等都可以算是容器.一个容器能够装什么,全部取决于你对该容器的定义.当然,有这样一种容器,它存放的不是文本.数值,而是对象.对象的描述(类.接口)或 ...
- laravel 服务容器实例——深入理解IoC模式
刚刚接触laravel,对于laravel的服务容器不是很理解.看了<Laravel框架关键技术解析>和网上的一些资料后对于服务容器有了一些自己的理解,在这里分享给大家 1.依赖 IoC模 ...
- laravel5.5服务提供器
目录 1. 编写服务提供器 1.1 注册方法 register 1.1.1 简单绑定 1.1.2 绑定单例 1.1.3 绑定实例 1.1.4 绑定初始数据 1.2 引导方法 boot 2. 注册服务提 ...
随机推荐
- kafka-connect-hdfs连接hadoop hdfs时候,竟然是单点的,太可怕了。。。果断改成HA
2017-08-16 11:57:28,237 WARN [org.apache.hadoop.hdfs.LeaseRenewer][458] - <Failed to renew lease ...
- Scrapy 框架 使用 selenium 爬取动态加载内容
使用 selenium 爬取动态加载内容 开启中间件 DOWNLOADER_MIDDLEWARES = { 'wangyiPro.middlewares.WangyiproDownloaderMidd ...
- Linux 系统故障排查和修复技巧
Linux 系统故障排查和修复技巧 我发现Linux系统在启动过程中会出现一些故障,导致系统无法正常启动,我在这里写了几个应用单用户模式.GRUB命令操作.Linux救援模式的故障修复案例帮助大家了解 ...
- access数据库查找以及如果结果中存在多个匹配用户该怎么处理?
查找用户的界面为: 首先对查找条件进行赋值: if (radioButton1.Checked) serMatchInfo = "用户姓名"; if (radioButton2.C ...
- [HEOI2015]小Z的房间 && [CQOI2018]社交网络
今天看了一下矩阵树定理,然后学了一下\(O(n ^ 3)\)的方法求行列式. 哦对了,所有的证明我都没看-- 这位大佬讲的好呀: [学习笔记]高斯消元.行列式.Matrix-Tree 矩阵树定理 关于 ...
- P1678 烦恼的高考志愿(二分)
emmmm,我感觉我在解题的过程中还是有点吃亏的,因为,我知道是二分,只是大概知道怎么分,没有管这道到底是需要怎样的二分.然后在题上卡了很久. 思路:要找到填报学校的录取线x和自己的分数y的绝对值最小 ...
- 爬取伯乐在线文章(五)itemloader
ItemLoader 在我们执行scrapy爬取字段中,会有大量的CSS或是Xpath代码,当要爬取的网站多了,要维护起来很麻烦,为解决这类问题,我们可以根据scrapy提供的loader机制. 导入 ...
- Linux:Day8(下) RAID
RAID:Redudant Arrays of Inexpensive(Independent) Disks 廉价(独立)冗余磁盘阵列 提高IO能力:磁盘并行读写: 提高耐用性:磁盘冗余来实现: ...
- 【css3】nth-child
nth-child含义 :nth-child(an+b) 这个 CSS 伪类匹配文档树中在其之前具有 an+b-1 个兄弟节点的元素,其中 n 为正值或零值. 简单点说就是,这个选择器匹配那些在同系列 ...
- Python socket套接字简单例子