Laravel 的 Contracts 是一组定义了框架核心服务的接口。说白了就是一组接口。使用它就是为了降低耦合性。

即便如此,是不是也有同学会搞不清楚Contracts在lavarel体系中的到底在一个什么样的位置?下面上一张自制的图,也许有地方不对,但是初学的同学可以通过它大概的,简单的解决下心中的困惑。

通过这张图我们可以看到,当写好自定义的Contract接口及其实现类后,在ServiceProvider中绑定,此时服务容器已经登记上这个Contract了。之后就可以在要用到它的地方,经过服务容器解析直接使用了

下面就详细写一下怎么具体的使用:

第一步,写一个Contract接口:

<?php
namespace App\Contracts; interface Hello
{
public function hello();
}

第二步,写上面Contract的实现类:

<?php
namespace App\Services; use App\Contracts\Hello; class HelloWorld implements Hello
{
function hello(){
return "Hello!~~";
}
}

第三步,写一个自定义的ServiceProvider:

<?php
namespace App\Providers; use Illuminate\Support\ServiceProvider; class HelloServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
} public function register()
{
//给这个接口一个别名
$this->app->bind('Hello','App\Contracts\Hello');
//将Contract接口和它的实现类绑定
$this->app->bind
('App\Contracts\Hello','App\Services\HelloWorld');
}
}

这里起别名的作用,是为了在使用的时候方便,不需要写完整的命名空间;绑定的作用是为了使用Contracts时,服务容器能够有线索找到它的实现类,从而解析出来。

第四步,在config\app.php中注册这个服务提供者: 
在providers中加入这行代码即可:

App\Providers\HelloServiceProvider::class,

第五步,可以使用了:

<?php

namespace App\Http\Controllers;

use App\Contracts\Hello;

class DiaryController extends Controller
{
/**
* 测试:Hello实例
*
* @var Hello
*/
protected $hello; /**
* Create a new controller instance.
* 创造一个Hello实例
*
* @param Hello $hello
* @return void
*/
public function __construct(Hello $hello){
$this->hello=$hello;
} /**
* Display a list of all of the user's diaries.
*
* @return Response
*/
public function index(){
return view('diaries.index',[
'hello'=>$this->hello->hello(),
]);
}
}

之后就可以在返回的视图中通过{{$hello}}来打印出Contract实现类中的返回内容了。
这里对第五步做几点说明:

在构造方法中,将Contract接口引入(注入)这里参数中‘Hello’就是刚才起的别名。
因为刚才已经在服务提供者中绑定了Contract和其实现方法,所以这里能够通过Hello这个Contract,解析并使用其实现类中的方法hello().

最新文章

  1. Socket编程基础知识
  2. PostgreSQL 列出所有表名和数据库名
  3. Linux下Boost交叉编译
  4. springMVC实现多文件上传
  5. 用VS2010开发Android应用的配置方法
  6. Java类加载器加载类顺序
  7. Error:Could not open initscript class cache for initialization script &#39;C:\Users\Avishek\AppData\Local\Temp\asLocalRepo14.gradle&#39; (C:\Users\Avishek.gradle\caches\2.2.1\scripts\asLocalRepo14_dkwbdtenxxg
  8. &lt;!--[if lt IE]&gt;
  9. Android中集成第三方库的方法和问题
  10. Android四种Activity的加载模式(转)
  11. Eclipse desktop
  12. 零基础开始学python
  13. JDK的下载,安装与环境的配置
  14. [USACO11JAN]大陆议会The Continental Cowngress_2-sat
  15. Linux学习之管道符、重定向、通配符、转义符、环境变量
  16. W7500S2E串口转以太网
  17. use Swig to create C/C++ extension for Python
  18. 2015-10-06 认识jQuery1
  19. node 文件操作
  20. leetcode1006

热门文章

  1. java CGLib代理
  2. 记录一次线上yarn RM频繁切换的故障
  3. unittest参数化(paramunittest)
  4. Error starting daemon: error initializing graphdriver: devmapper: Device docker-thinpool is not a thin pool
  5. android中sqlite数据库的基本使用和添加多张表
  6. hdu 1572 全排列的搜索
  7. Typeof() 和 GetType()区别
  8. vc 网络编程(socket)
  9. mvc控制器返回操作结果封装
  10. php--最新正则(手机号码)