Laravel Contracts 学习笔记

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

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

20170425175642777.jpg

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

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

第一步,写一个Contract接口:

<?php

namespace App\Contracts;

interface LeokimContract
{
    public function test($id);
}


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

<?php

use App\Contracts\LeokimContract;

class LeokimService implements LeokimContract
{
    function test($id){
        return "ID is :".$id;
    }
}

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

<?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中加入这行代码即可:

 App\Providers\HelloServiceProvider::class,

第五步,可以使用了:

<?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().