对于所需要的内容,约定一个统一的规范
契约 是通过这个方法绑定的 $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 $db
Route::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-松耦合