laravel 契约

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

契约 是通过这个方法绑定的 $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-松耦合

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伟伟哦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值