Laravel Contracts 学习笔记

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

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

20170425175642777.jpg

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

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

第一步,写一个Contract接口:

1
2
3
4
5
6
7
8
<?php
 
namespace App\Contracts;
 
interface LeokimContract
{
    public function test($id);
}


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

1
2
3
4
5
6
7
8
9
10
<?php
 
use App\Contracts\LeokimContract;
 
class LeokimService implements LeokimContract
{
    function test($id){
        return "ID is :".$id;
    }
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
 
namespace App\Providers;
 
use App\Http\Controllers\LeokimController;
use Illuminate\Support\ServiceProvider;
 
class LeokimProviders extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
 
    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //简单绑定
//        $this->app->bind(LeokimController::class, function (){
//            return new LeokimController('LeoKim-Test!! ');
//        });
 
        //给Contracts一个别名
//        $this->app->bind('LeokimContract','APP\Contracts\LeokimContract');
 
        //绑定接口到实现
        $this->app->bind('App\Contracts\LeokimContract','App\Services\LeokimService');
    }
}

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

第四步,在config\app.PHP中注册这个服务提供者:

在providers中加入这行代码即可:

1
 App\Providers\HelloServiceProvider::class,

第五步,可以使用了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
 
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
 
use App\Contracts\LeokimContract;
 
class LeokimController extends Controller
{
    protected $leo;
 
//    function __construct($leo)
//    {
//        $this->leo = $leo;
//    }
 
    function __construct(LeokimContract $leo)
    {
        $this->leo = $leo;
    }
 
//    function index(){
//        echo '123';
//    }
 
    function test($id){
        return $this->leo->test($id);
    }
}
  1. 在构造方法中,将Contract接口引入(注入)这里参数中‘LeokimContract’就是刚才起的别名。

  2. 因为刚才已经在服务提供者中绑定了Contract和其实现方法,所以这里能够通过LeokimContract这个Contract,解析并使用其实现类中的方法test().