Laravel 的 Contracts 是一组定义了框架核心服务的接口。说白了就是一组接口。使用它就是为了降低耦合性。
即便如此,是不是也有同学会搞不清楚Contracts在lavarel体系中的到底在一个什么样的位置?下面上一张自制的图,也许有地方不对,但是初学的同学可以通过它大概的,简单的解决下心中的困惑。
通过这张图我们可以看到,当写好自定义的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); } }
-
在构造方法中,将Contract接口引入(注入)这里参数中‘LeokimContract’就是刚才起的别名。
-
因为刚才已经在服务提供者中绑定了Contract和其实现方法,所以这里能够通过LeokimContract这个Contract,解析并使用其实现类中的方法test().