对于所需要的内容,约定一个统一的规范

契约 是通过这个方法绑定的 $app->singleton()

契约也是绑定在标识中 bind() 下的 this->bindings[$abstract] = compact(‘concrete’,‘shared’);

Laravel 中的契约是指框架提供的一系列定义核心服务的接口。 例如,Illuminate\Contracts\Queue\Queue 契约定义了队列任务需要实现的方法,Illuminate\Contracts\Mail\Mailer 契约定义了发送邮件所需要实现的方法。 每一个契约都有框架提供的相应实现。例如,Laravel 为队列提供了多个驱动的实现,邮件则由 SwiftMailer 驱动实现 。 所有 Laravel 契约都有其对应的GitHub库,这为所有有效的契约提供了快速入门指南,同时也可以作为独立、解耦的包被包开发者使用。

Laravel 门面为 Laravel 服务的使用提供了便捷方式 —— 不再需要从服务容器中类型提示和契约解析即可直接通过静态门面调用。 不同于门面不需要再构造器中进行类型提示,契约允许你在类中定义显式的依赖。有些开发者喜欢门面带来的便捷,也有些开发者倾向于使用契约,他们喜欢定义明确的依赖

Laravel中很多类都是通过服务容器进行解析,包括控制器,以及监听器、中间件、队列任务,甚至路由闭包。所以,要实现一个契约,需要在解析类的构造函数中类型提示这个契约接口

Contracts\Order\OrderService.php 就是接口 实现接口

一、契约的基础使用

契约简单就是一个接口 ,规范必须这么做

路径图面上有

E:\xampp\htdocs\xampp\blog\app\Contracts\DBContracts.php

<?php
namespace App\Contracts;/****/
interface DBContracts
{public function index();
}

E:\xampp\htdocs\xampp\blog\app\Utils\Orcale.php

<?php
namespace App\Utils;use App\Contracts\DBContracts;/****/
class Orcale implements DBContracts
{public function index(){return 'this is Orcale index 这是一个简单的工具类  Orcale';}
}
<?php
namespace App\Utils;use App\Contracts\DBContracts;
/****/
class MySql implements DBContracts
{public function index(){return 'dfsajfksajfklsafjk';}
}

契约和当前实现的这个类要做一个绑定

E:\xampp\htdocs\xampp\blog\app\Providers\RinkServicePrivoder.php

创建一个服务提供者

  /*** Register services.* 注册用户自己定义的服务* @return void*/public function register(){#向我们容器中注入信息           #这就是标识   这就是我们标识所对应的类#$this->app->singleton('dbfacade', \App\Utils\MySql::class);// $this->app->singleton('mysql', \App\Services\MysqlService::class);// 契约和实例类做一个绑定       契约的类                          实例类$this->app->singleton(\App\Contracts\DBContracts::class, \App\Utils\MySQL::class);// \App\Utils\MySQL::class =》  \App\Utils\Oracle::class}

使用的方式

<?php/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|*///#最开始调用的类 使用一个类
//use App\Utils\Demo;
//Route::get('demo', function(){//    #如果Mysql.php切换到Orcale.php 就需要注释调呀
//    $demo = new Demo;
//    return $demo->index();
//});#use App\Facades\DBFacade;
use App\Contracts\DBContracts;#use DBFacade;
Route::get('dbfacade', 'TestController@demo');#这个类(use App\Contracts\DBContracts;),当做参数传进来  这个就是参数 DBContracts $dbRoute::get('demo', function(DBContracts $db){return $db->index();
});Route::get('user', function(){// $demo = new MySql;// return $demo->index();// return DBFacade::index();// $demo = new MySql;// return $demo->index();
});Route::get('oracle', function(){// $demo = new MySql;// return $demo->index();// return DBFacade::index();// $demo = new MySql;// return $demo->index();
});//-----------------------------------------
Route::get('/', function () {return view('welcome');
});
Route::get('test', 'TestController@contracts');Route::any('/{class}-{action}',function($class, $action, App\Contracts\ControllerDispatcher $dispatcher){$class = 'App\\Http\\Controllers\\'.ucfirst(strtolower($class)).'Controller';return $dispatcher->run($class, $action);// if(class_exists($class))// {//     $classObject = new $class();//     if(method_exists($classObject, $action)) return call_user_func(array($classObject, $action));// } else {//     return $class.' connot find';// }
})->where(['module' => '[0-9a-z]+', 'class' => '[0-9a-z]+', 'action' => '[0-9a-z]+']);

参考文章
https://xueyuanjun.com/post/8710.html#bkmrk-松耦合

laravel 契约相关推荐

  1. PHP 服务契约,laravel 契约的使用

    契约的使用这方面很少文章介绍,很多文章都是直接翻译了文档,并没有提到实际中的使用. 个人理解的契约就是接口,那么他的使用其实是应该类似于写观察者模式时候一样,方法中的参数使用的是接口,但实际传参的时候 ...

  2. 浅析 Laravel 底层原理:契约(Contracts)

    简介 Laravel 中的契约是指框架提供的一系列定义核心服务的接口(interface). 例如,Illuminate\Contracts\Queue\Queue 契约定义了队列任务所需的方法,而 ...

  3. laravel 5.6入门

    文章目录 第一章:laravel安装 1. 安装方法一:homestead 虚拟机 2. 安装方法二:composer安装 第二章:laravel目录结构介绍 第三章:laravel路由 1. 基本路 ...

  4. 核心概念 —— 契约(Contracts)

    1.简介 中的是指框架提供的一系列定义核心服务的. 例如 ,Illuminate\Contracts\Queue\Queue契约定义了队列任务需要实现的方法,Illuminate\Contracts\ ...

  5. php contract的作用,契约(Contracts)

    契约(Contracts) 由 学院君 创建于4年前, 最后更新于 11个月前 版本号 #2 12214 views 7 likes 0 collects 1.简介 Laravel中的契约是指框架提供 ...

  6. 核心概念 —— 门面(Facades)

    1.简介 为应用的中的绑定类提供了一个"静态"接口. 内置了很多门面,你可能在不知道的情况下正在使用它们.Laravel 的门面作为中的底层类的"静态代理",相 ...

  7. 浅谈Laravel中的设计模式(四) Contract 契约模式

    阅读时长:3分钟 技术预备:熟悉Laravel的使用 契约模式(Contract) 一.首先什么是契约模式呢? 学过Java的童鞋一定知道interface.抽象类之类的概念. 主要就是为了具有相同操 ...

  8. Laravel核心解读--Contracts契约

    Contracts Laravel 的契约是一组定义框架提供的核心服务的接口, 例如我们在介绍用户认证的章节中到的用户看守器契约IllumninateContractsAuthGuard 和用户提供器 ...

  9. Laravel源码解析之契约

    概述 Contract,翻译过来叫契约.协议等.在 Laravel-china 的翻译中,是一个不翻词,这里也使用 Contract 来代替. Contract 就是接口 Interface,用来规范 ...

最新文章

  1. 面试:说说 HTTPS 的工作原理?
  2. 让 ScrollViewer 的滚动带上动画
  3. 关于网页乱码和字符编码方式
  4. linux spyder 目录,linux下创建spyder桌面图标的方法
  5. 程序怎么启动vasp_构建可扩展的GPU加速应用程序(NVIDIA HPC)
  6. WPS版excel怎样核对两表数据和文本不一致之处
  7. Kubernetes pod状态出现ImagePullBackOff的原因
  8. 参考信息 - 云原生(Cloud Native)
  9. centos7进入单用户模式
  10. 分布式文件系统HDFS体系
  11. [目标检测] Faster R-CNN 深入理解 amp;amp; 改进方法汇总
  12. 软考——软件工程——结构化分析与设计方法
  13. 使用代码调用Attachments(附件)
  14. Leetcode题medium48/54/55/56/59/62/63/64,Python多种解法(四)
  15. 12306 官网硬卧下铺的选择
  16. C++ 实现matlab高斯滤波函数imgaussfilt
  17. socket通信显示连接被拒绝问题总结
  18. 用C语言程序进行比赛日程排列
  19. 网易云信七鱼市场总监姜菡钰:实战解读增长黑客在B端业务的运用
  20. 「BUG记录」关于在安装AD9910 Evaluation Software过程中遇到的问题

热门文章

  1. 仁慈的独裁者——Python之父吉多·范罗苏姆
  2. LeetCode 546. 移除盒子 | Python
  3. open jdk卸载
  4. 2019北京培训:MySQLday1
  5. 软件工程与UML图的关系
  6. 详解HMM模型 及 实现(之一:problem1)
  7. Win10显示dds及tga缩略图
  8. acl中的反掩码,acl掩码匹配规则
  9. HEVC 编解码详解
  10. html视频文件转换成视频,Amazing Video to HTML5 Converter(视频到HTML5转换器) V1.7.0 官方版...